diff --git a/.github/labeler.yaml b/.github/labeler.yaml index 520e2d12a50..039a4fe84a5 100644 --- a/.github/labeler.yaml +++ b/.github/labeler.yaml @@ -6,10 +6,6 @@ car: - changed-files: - any-glob-to-any-file: 'opendbc/car/**' -car safety: - - changed-files: - - any-glob-to-any-file: 'opendbc/safety/**' - can: - changed-files: - any-glob-to-any-file: 'opendbc/can/**' diff --git a/.github/workflows/test_models_trigger.yaml b/.github/workflows/test_models_trigger.yaml deleted file mode 100644 index c93469a6f60..00000000000 --- a/.github/workflows/test_models_trigger.yaml +++ /dev/null @@ -1,60 +0,0 @@ -name: test models trigger - -on: - issue_comment: - types: [created, edited] - -jobs: - scan-comments: - runs-on: ubuntu-latest - if: ${{ github.event.issue.pull_request }} - steps: - - name: Check for trigger phrase - id: check_comment - uses: actions/github-script@v7 - with: - script: | - const triggerPhrase = "trigger-test-models"; - const comment = context.payload.comment.body; - const commenter = context.payload.comment.user.login; - - const { data: permissions } = await github.rest.repos.getCollaboratorPermissionLevel({ - owner: context.repo.owner, - repo: context.repo.repo, - username: commenter - }); - - const hasWriteAccess = permissions.permission === 'write' || permissions.permission === 'admin'; - - return (hasWriteAccess && comment.includes(triggerPhrase)); - result-encoding: json - - - name: Checkout openpilot - if: steps.check_comment.outputs.result == 'true' - uses: actions/checkout@v4 - with: - repository: 'commaai/openpilot' - submodules: 'true' - - - name: bump opendbc - if: steps.check_comment.outputs.result == 'true' - run: | - cd opendbc_repo - git fetch origin pull/${{ github.event.issue.number }}/head - git checkout FETCH_HEAD - cd .. - git add . - - - name: Create Pull Request - if: steps.check_comment.outputs.result == 'true' - uses: peter-evans/create-pull-request@9153d834b60caba6d51c9b9510b087acf9f33f83 - with: - author: Vehicle Researcher - token: ${{ secrets.ACTIONS_CREATE_PR_PAT }} - commit-message: test models - title: '[opendbc] test_models run from ${{ github.event.issue.number }}' - branch: test_models_${{ github.event.issue.number }} - base: master - delete-branch: true - body: 'Testing some opendbc changes from https://github.com/commaai/opendbc/pull/${{ github.event.issue.number }}' - labels: bot diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index be3c8828876..ddbcbc26787 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -13,93 +13,8 @@ jobs: strategy: fail-fast: false matrix: - include: - - os: ${{ github.repository == 'commaai/opendbc' && 'namespace-profile-amd64-8x16' || 'ubuntu-24.04' }} - - os: ${{ github.repository == 'commaai/opendbc' && 'namespace-profile-macos-8x14' || 'macos-latest' }} + os: [ubuntu-24.04, macos-latest] steps: - uses: commaai/timeout@v1 - uses: actions/checkout@v4 - run: ./test.sh - - safety_tests: - name: safety - runs-on: ${{ github.repository == 'commaai/opendbc' && 'namespace-profile-amd64-8x16' || 'ubuntu-latest' }} - strategy: - fail-fast: false - matrix: - flags: ['', '--ubsan'] - steps: - - uses: commaai/timeout@v1 - - uses: actions/checkout@v4 - - name: Run safety tests - run: ./opendbc/safety/tests/test.sh ${{ matrix.flags }} - - misra_linter: - name: MISRA C:2012 Linter - runs-on: ${{ github.repository == 'commaai/opendbc' && 'namespace-profile-amd64-8x16' || 'ubuntu-latest' }} - timeout-minutes: 20 - steps: - - name: Set up - run: sudo apt-get install -y --no-install-recommends gcc-arm-none-eabi libnewlib-arm-none-eabi - - uses: actions/checkout@v4 - - name: Restore cached cppcheck - uses: actions/cache@v4 - with: - path: opendbc/safety/tests/misra/cppcheck/ - key: cppcheck-cache-${{ runner.os }}-${{ github.ref }} - restore-keys: | - cppcheck-cache-${{ runner.os }}-${{ github.ref }} - cppcheck-cache-${{ runner.os }}- - - name: Run MISRA C:2012 analysis - timeout-minutes: ${{ ((steps.restore-scons-cache.outputs.cache-hit == 'true') && 1 || 2) }} - run: cd opendbc/safety/tests/misra && ./test_misra.sh - - name: Save cppcheck cache - uses: actions/cache@v4 - with: - path: opendbc/safety/tests/misra/cppcheck/ - key: cppcheck-cache-${{ runner.os }}-${{ github.ref }} - - misra_mutation: - name: MISRA C:2012 Mutation - runs-on: ${{ github.repository == 'commaai/opendbc' && 'namespace-profile-amd64-8x16' || 'ubuntu-latest' }} - timeout-minutes: 20 - steps: - - name: Set up - run: sudo apt-get install -y --no-install-recommends gcc-arm-none-eabi libnewlib-arm-none-eabi - - uses: actions/checkout@v4 - - name: Restore cached cppcheck - uses: actions/cache@v4 - with: - path: opendbc/safety/tests/misra/cppcheck/ - key: cppcheck-cache-${{ runner.os }}-${{ github.ref }} - restore-keys: | - cppcheck-cache-${{ runner.os }}-${{ github.ref }} - cppcheck-cache-${{ runner.os }}- - - name: MISRA mutation tests - timeout-minutes: 1 - run: | - source setup.sh - scons -j8 - cd opendbc/safety/tests/misra - ./install.sh # cppcheck - pytest -s -n8 --randomly-seed $RANDOM test_mutation.py - - name: Save cppcheck cache - uses: actions/cache@v4 - with: - path: opendbc/safety/tests/misra/cppcheck/ - key: cppcheck-cache-${{ runner.os }}-${{ github.ref }} - - mutation: - name: Safety mutation tests - runs-on: ${{ github.repository == 'commaai/opendbc' && 'namespace-profile-amd64-8x16' || 'ubuntu-latest' }} - timeout-minutes: 20 - steps: - - uses: actions/checkout@v4 - with: - fetch-depth: 0 # need master to get diff - - name: Run mutation tests - timeout-minutes: 5 - run: | - source setup.sh - scons -j8 - GIT_REF=${{ github.event_name == 'push' && github.ref == 'refs/heads/master' && github.event.before || 'origin/master' }} cd opendbc/safety/tests && ./mutation.sh diff --git a/.gitignore b/.gitignore index cb96f08721a..63e31bb543d 100644 --- a/.gitignore +++ b/.gitignore @@ -3,8 +3,6 @@ *.pyc *.os *.o -*.so -*.a *.tmp *.dylib .*.swp @@ -13,18 +11,14 @@ .hypothesis *.egg-info/ *.html -*.gcda -*.gcno - uv.lock +opendbc/can/*.so +opendbc/can/*.a opendbc/can/build/ opendbc/can/obj/ opendbc/can/packer_pyx.cpp opendbc/can/parser_pyx.cpp opendbc/can/packer_pyx.html opendbc/can/parser_pyx.html -opendbc/dbc/*_generated.dbc - -cppcheck-addon-ctu-file-list -opendbc/safety/tests/coverage-out +opendbc/dbc/*_generated.dbc \ No newline at end of file diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 80bb697e4eb..7b6d9157211 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -35,3 +35,10 @@ repos: - --counting=detailed - --linelength=240 - --filter=-build,-legal,-readability,-runtime,-whitespace,+build/include_subdir,+build/forward_decl,+build/include_what_you_use,+build/deprecated,+whitespace/comma,+whitespace/line_length,+whitespace/empty_if_body,+whitespace/empty_loop_body,+whitespace/empty_conditional_body,+whitespace/forcolon,+whitespace/parens,+whitespace/semicolon,+whitespace/tab,+readability/braces +- repo: local + hooks: + - id: generator + name: dbc generator + entry: opendbc/dbc/generator/test_generator.py + language: script + pass_filenames: false diff --git a/README.md b/README.md index 8829a2e87ab..0b6af2f39ff 100644 --- a/README.md +++ b/README.md @@ -57,7 +57,6 @@ pre-commit run --all-files # run the linter * [`opendbc/dbc/`](opendbc/dbc/) is a repository of [DBC](https://en.wikipedia.org/wiki/CAN_bus#DBC) files * [`opendbc/can/`](opendbc/can/) is a library for parsing and building CAN messages from DBC files * [`opendbc/car/`](opendbc/car/) is a high-level library for interfacing with cars using Python -* [`opendbc/safety/`](opendbc/safety/) is the functional safety for all the cars supported by `opendbc/car/` ## How to Port a Car @@ -70,7 +69,7 @@ At its most basic, a car port will control the steering on a car. A "complete" c The first step is to get connected to the car with a comma 3X and a car harness. The car harness gets you connected to two different CAN buses and splits one of those buses to send our own actuation messages. -If you're lucky, a harness compatible with your car will already be designed and sold on comma.ai/shop. +If you're lucky, a harness compatible with your car will already be designed and sold on comma.ai/shop. If you're not so lucky, start with a "developer harness" from comma.ai/shop and crimp on whatever connector you need. ### Structure of a port @@ -79,11 +78,11 @@ Depending on , most of this basic structure will already be in place. The entirery of a car port lives in `opendbc/car//`: * `carstate.py`: parses out the relevant information from the CAN stream using the car's DBC file -* `carcontroller.py`: outputs CAN messages to control the car +* `carcontroller.py`: outputs CAN messages to control the car * `can.py`: thin Python helpers around the DBC file to build CAN messages * `fingerprints.py`: database of ECU firmware versions for identifying car models * `interface.py`: high level class for interfacing with the car -* `radar_interface.py`: parses out the radar +* `radar_interface.py`: parses out the radar * `values.py`: enumerates the brand's supported cars ### Reverse Engineer CAN messages @@ -98,7 +97,7 @@ Use the [longitudinal maneuvers](https://github.com/commaai/openpilot/tree/maste ## Contributing -All opendbc development is coordinated on GitHub and [Discord](https://discord.comma.ai). Check out the `#dev-opendbc-cars` channel and `Vehicle Specific` section. +All opendbc development is coordinated on GitHub and [Discord](https://discord.comma.ai). Check out the `#dev-opendbc-cars` channel and `Vehicle Specific` section. ### Roadmap @@ -117,29 +116,6 @@ Longer term Contributions towards anything here are welcome. -## Safety Model - -When a [panda](https://comma.ai/shop/panda) powers up with [opendbc safety firmware](opendbc/safety), by default it's in `SAFETY_SILENT` mode. While in `SAFETY_SILENT` mode, the CAN buses are forced to be silent. In order to send messages, you have to select a safety mode. Some of safety modes (for example `SAFETY_ALLOUTPUT`) are disabled in release firmwares. In order to use them, compile and flash your own build. - -Safety modes optionally support `controls_allowed`, which allows or blocks a subset of messages based on a customizable state in the board. - -## Code Rigor - -The opendbc safety firmware is written for its use in conjunction with [openpilot](https://github.com/commaai/openpilot) and [panda](https://github.com/commaai/panda). The safety firmware, through its safety model, provides and enforces the -[openpilot safety](https://github.com/commaai/openpilot/blob/master/docs/SAFETY.md). Due to its critical function, it's important that the application code rigor within the `safety` folder is held to high standards. - -These are the [CI regression tests](https://github.com/commaai/opendbc/actions) we have in place: -* A generic static code analysis is performed by [cppcheck](https://github.com/danmar/cppcheck/). -* In addition, [cppcheck](https://github.com/danmar/cppcheck/) has a specific addon to check for [MISRA C:2012](https://misra.org.uk/) violations. See [current coverage](opendbc/safety/tests/misra/coverage_table). -* Compiler options are relatively strict: the flags `-Wall -Wextra -Wstrict-prototypes -Werror` are enforced. -* The [safety logic](opendbc/safety) is tested and verified by [unit tests](opendbc/safety/tests) for each supported car variant. - -The above tests are themselves tested by: -* a [mutation test](opendbc/safety/tests/misra/test_mutation.py) on the MISRA coverage -* 100% line coverage enforced on the safety unit tests - -In addition, we run the [ruff linter](https://github.com/astral-sh/ruff) and [mypy](https://mypy-lang.org/) on the car interface library. - ### Bounties Every car port is eligible for a bounty: @@ -161,7 +137,7 @@ In addition to the standard bounties, we also offer higher value bounties for mo ***How does this work?*** In short, we designed hardware to replace your car's built-in lane keep and adaptive cruise features. See [this talk](https://www.youtube.com/watch?v=FL8CxUSfipM) for an in-depth explanation. -***Is there a timeline or roadmap for adding car support?*** No, most car support comes from the community, with comma doing final safety and quality validation. The more complete the community car port is and the more popular the car is, the more likely we are to pick it up as the next one to validate. +***Is there a timeline or roadmap for adding car support?*** No, most car support comes from the community, with comma doing final safety and quality validation. The more complete the community car port is and the more popular the car is, the more likely we are to pick it up as the next one to validate. ### Terms @@ -187,7 +163,7 @@ In addition to the standard bounties, we also offer higher value bounties for mo * [*How to Port a Car*](https://www.youtube.com/watch?v=XxPS5TpTUnI&t=142s&pp=ygUPamFzb24gY29tbWEgY29u) by [@jyoung8607](https://github.com/jyoung8607) from COMMA_CON 2023 * [commaCarSegments](https://huggingface.co/datasets/commaai/commaCarSegments): a massive dataset of CAN data from 300 different car models * [cabana](https://github.com/commaai/openpilot/tree/master/tools/cabana#readme): our tool for reverse engineering CAN messages -* [can_print_changes.py](https://github.com/commaai/openpilot/blob/master/selfdrive/debug/can_print_changes.py): diff the whole CAN bus across two drives, such as one without any LKAS and one with LKAS +* [can_print_changes.py](https://github.com/commaai/openpilot/blob/master/selfdrive/debug/can_print_changes.py): diff the whole CAN bus across two drives, such as one without any LKAS and one with LKAS * [longitudinal maneuvers](https://github.com/commaai/openpilot/tree/master/tools/longitudinal_maneuvers): a tool for evaluating and tuning longitudinal control * [opendbc data](https://commaai.github.io/opendbc-data/): a repository of longitudinal maneuver evaluations diff --git a/SConscript b/SConscript index 33c09d6429d..2a3e11b2d96 100644 --- a/SConscript +++ b/SConscript @@ -2,7 +2,3 @@ Import("env") SConscript(['opendbc/can/SConscript'], exports={'env': env}) SConscript(['opendbc/dbc/SConscript'], exports={'env': env}) - -# test files -if GetOption('extras'): - SConscript('opendbc/safety/tests/libsafety/SConscript') diff --git a/SConstruct b/SConstruct index 352e07a52ab..3a1eeffdfda 100644 --- a/SConstruct +++ b/SConstruct @@ -25,19 +25,6 @@ AddOption('--asan', action='store_true', help='turn on ASAN') -# safety options -AddOption('--ubsan', - action='store_true', - help='turn on UBSan') - -AddOption('--coverage', - action='store_true', - help='build with test coverage options') - -AddOption('--mutation', - action='store_true', - help='generate mutation-ready code') - ccflags_asan = ["-fsanitize=address", "-fno-omit-frame-pointer"] if GetOption('asan') else [] ldflags_asan = ["-fsanitize=address"] if GetOption('asan') else [] diff --git a/conftest.py b/conftest.py deleted file mode 100644 index 4e6c5e44a0e..00000000000 --- a/conftest.py +++ /dev/null @@ -1,4 +0,0 @@ -# pytest attempts to execute shell scripts while collecting -collect_ignore_glob = [ - "opendbc/safety/tests/misra/*", -] diff --git a/docs/CARS.md b/docs/CARS.md index d264c5ea957..56b02837adc 100644 --- a/docs/CARS.md +++ b/docs/CARS.md @@ -1,6 +1,6 @@ -# Support Information for 350 Known Cars +# Support Information for 347 Known Cars |Make|Model|Package|Support Level| |---|---|---|:---:| @@ -8,6 +8,7 @@ |Acura|Integra 2024|All|[Community](#community)| |Acura|RDX 2016-18|AcuraWatch Plus|[Upstream](#upstream)| |Acura|RDX 2019-21|All|[Upstream](#upstream)| +|Acura|RDX 2022|All|[Upstream](#upstream)| |Audi|A3 2014-19|Adaptive Cruise Control (ACC) & Lane Assist|[Upstream](#upstream)| |Audi|A3 Sportback e-tron 2017-18|Adaptive Cruise Control (ACC) & Lane Assist|[Upstream](#upstream)| |Audi|A4 2016-24|All|[Not compatible](#flexray)| @@ -36,8 +37,9 @@ |Ford|Escape Plug-in Hybrid 2020-22|Co-Pilot360 Assist+|[Upstream](#upstream)| |Ford|Explorer 2020-24|Co-Pilot360 Assist+|[Upstream](#upstream)| |Ford|Explorer Hybrid 2020-24|Co-Pilot360 Assist+|[Upstream](#upstream)| -|Ford|F-150 2021-23|Co-Pilot360 Assist 2.0|[Upstream](#upstream)| -|Ford|F-150 Hybrid 2021-23|Co-Pilot360 Assist 2.0|[Upstream](#upstream)| +|Ford|F-150 2022-23|Co-Pilot360 Assist 2.0|[Under review](#under-review)| +|Ford|F-150 Hybrid 2022-23|Co-Pilot360 Assist 2.0|[Under review](#under-review)| +|Ford|F-150 Lightning 2022-23|Co-Pilot360 Assist 2.0|[Under review](#under-review)| |Ford|Focus 2018|Adaptive Cruise Control with Lane Centering|[Upstream](#upstream)| |Ford|Focus Hybrid 2018|Adaptive Cruise Control with Lane Centering|[Upstream](#upstream)| |Ford|Kuga 2020-22|Adaptive Cruise Control with Lane Centering|[Upstream](#upstream)| @@ -47,8 +49,8 @@ |Ford|Maverick 2023-24|Co-Pilot360 Assist|[Upstream](#upstream)| |Ford|Maverick Hybrid 2022|LARIAT Luxury|[Upstream](#upstream)| |Ford|Maverick Hybrid 2023-24|Co-Pilot360 Assist|[Upstream](#upstream)| -|Ford|Mustang Mach-E 2021-23|All|[Upstream](#upstream)| -|Ford|Ranger 2024|Adaptive Cruise Control with Lane Centering|[Upstream](#upstream)| +|Ford|Mustang Mach-E 2021-23|All|[Under review](#under-review)| +|Ford|Ranger 2024|Adaptive Cruise Control with Lane Centering|[Under review](#under-review)| |Genesis|G70 2018|All|[Upstream](#upstream)| |Genesis|G70 2019-21|All|[Upstream](#upstream)| |Genesis|G70 2022-23|All|[Upstream](#upstream)| @@ -58,10 +60,10 @@ |Genesis|G90 2017-20|All|[Upstream](#upstream)| |Genesis|GV60 (Advanced Trim) 2023|All|[Upstream](#upstream)| |Genesis|GV60 (Performance Trim) 2022-23|All|[Upstream](#upstream)| -|Genesis|GV70 (2.5T Trim, without HDA II) 2022-24|All|[Upstream](#upstream)| +|Genesis|GV70 (2.5T Trim, without HDA II) 2022-23|All|[Upstream](#upstream)| |Genesis|GV70 (3.5T Trim, without HDA II) 2022-23|All|[Upstream](#upstream)| |Genesis|GV70 Electrified (Australia Only) 2022|All|[Upstream](#upstream)| -|Genesis|GV70 Electrified (with HDA II) 2023-24|Highway Driving Assist II|[Upstream](#upstream)| +|Genesis|GV70 Electrified (with HDA II) 2023|Highway Driving Assist II|[Upstream](#upstream)| |Genesis|GV80 2023|All|[Upstream](#upstream)| |GMC|Sierra 1500 2020-21|Driver Alert Package II|[Upstream](#upstream)| |GMC|Yukon 2019-20|Adaptive Cruise Control (ACC) & LKAS|[Dashcam mode](#dashcam)| @@ -87,7 +89,7 @@ |Honda|Insight 2019-22|All|[Upstream](#upstream)| |Honda|Inspire 2018|All|[Upstream](#upstream)| |Honda|Odyssey 2018-20|Honda Sensing|[Upstream](#upstream)| -|Honda|Odyssey 2021-25|All|[Community](#community)| +|Honda|Odyssey 2021-25|All|[Upstream](#upstream)| |Honda|Passport 2019-23|All|[Upstream](#upstream)| |Honda|Pilot 2016-22|Honda Sensing|[Upstream](#upstream)| |Honda|Pilot 2023-24|All|[Community](#community)| @@ -114,12 +116,10 @@ |Hyundai|Ioniq Plug-in Hybrid 2019|Smart Cruise Control (SCC)|[Upstream](#upstream)| |Hyundai|Ioniq Plug-in Hybrid 2020-22|All|[Upstream](#upstream)| |Hyundai|Kona 2020|Smart Cruise Control (SCC)|[Upstream](#upstream)| -|Hyundai|Kona 2022|Smart Cruise Control (SCC)|[Upstream](#upstream)| |Hyundai|Kona Electric 2018-21|Smart Cruise Control (SCC)|[Upstream](#upstream)| |Hyundai|Kona Electric 2022-23|Smart Cruise Control (SCC)|[Upstream](#upstream)| |Hyundai|Kona Electric (with HDA II, Korea only) 2023|Smart Cruise Control (SCC)|[Upstream](#upstream)| |Hyundai|Kona Hybrid 2020|Smart Cruise Control (SCC)|[Upstream](#upstream)| -|Hyundai|Nexo 2021|All|[Upstream](#upstream)| |Hyundai|Palisade 2020-22|All|[Upstream](#upstream)| |Hyundai|Palisade 2023-24|HDA2|[Community](#community)| |Hyundai|Santa Cruz 2022-24|Smart Cruise Control (SCC)|[Upstream](#upstream)| @@ -219,8 +219,8 @@ |Ram|1500 2019-24|Adaptive Cruise Control (ACC)|[Upstream](#upstream)| |Ram|2500 2020-24|Adaptive Cruise Control (ACC)|[Dashcam mode](#dashcam)| |Ram|3500 2019-22|Adaptive Cruise Control (ACC)|[Dashcam mode](#dashcam)| -|Rivian|R1S 2022-24|All|[Upstream](#upstream)| -|Rivian|R1T 2022-24|All|[Upstream](#upstream)| +|Rivian|R1S 2022-24|All|[Dashcam mode](#dashcam)| +|Rivian|R1T 2022-24|All|[Dashcam mode](#dashcam)| |SEAT|Alhambra 2018-20|Adaptive Cruise Control (ACC) & Lane Assist|[Dashcam mode](#dashcam)| |SEAT|Ateca 2016-23|Adaptive Cruise Control (ACC) & Lane Assist|[Upstream](#upstream)| |SEAT|Leon 2014-20|Adaptive Cruise Control (ACC) & Lane Assist|[Upstream](#upstream)| @@ -253,10 +253,8 @@ |Škoda|Octavia Scout 2017-19|Adaptive Cruise Control (ACC) & Lane Assist|[Upstream](#upstream)| |Škoda|Scala 2020-23|Adaptive Cruise Control (ACC) & Lane Assist|[Upstream](#upstream)| |Škoda|Superb 2015-22|Adaptive Cruise Control (ACC) & Lane Assist|[Upstream](#upstream)| -|Tesla|Model 3 (with HW3) 2019-23|All|[Upstream](#upstream)| -|Tesla|Model 3 (with HW4) 2024|All|[Upstream](#upstream)| -|Tesla|Model Y (with HW3) 2020-23|All|[Upstream](#upstream)| -|Tesla|Model Y (with HW4) 2024|All|[Upstream](#upstream)| +|Tesla|Model 3 2019-24|Traffic Aware Cruise Control|[Dashcam mode](#dashcam)| +|Tesla|Model Y 2020-24|Traffic Aware Cruise Control|[Dashcam mode](#dashcam)| |Toyota|Alphard 2019-20|All|[Upstream](#upstream)| |Toyota|Alphard Hybrid 2021|All|[Upstream](#upstream)| |Toyota|Avalon 2016|Toyota Safety Sense P|[Upstream](#upstream)| @@ -421,4 +419,4 @@ Toyota, and the GM Global B platform. All the cars that openpilot supports use a [CAN bus](https://en.wikipedia.org/wiki/CAN_bus) for communication between all the car's computers, however a CAN bus isn't the only way that the computers in your car can communicate. Most, if not all, vehicles from the following manufacturers use [FlexRay](https://en.wikipedia.org/wiki/FlexRay) instead of a CAN bus: **BMW, Mercedes, Audi, Land Rover, and some Volvo**. These cars -may one day be supported, but we have no immediate plans to support FlexRay. \ No newline at end of file +may one day be supported, but we have no immediate plans to support FlexRay. diff --git a/examples/joystick.py b/examples/joystick.py index c34878f3606..0167c8d2012 100755 --- a/examples/joystick.py +++ b/examples/joystick.py @@ -82,7 +82,7 @@ def main(joystick): CC = CarControl(enabled=False) while True: CC.actuators.accel = float(4.0*np.clip(joystick.axes_values['gb'], -1, 1)) - CC.actuators.torque = float(np.clip(joystick.axes_values['steer'], -1, 1)) + CC.actuators.steer = float(np.clip(joystick.axes_values['steer'], -1, 1)) pprint(CC) p.read() @@ -110,4 +110,4 @@ def main(joystick): joystick = Keyboard() else: joystick = Joystick(gamepad=(args.mode == 'gamepad')) - main(joystick) + main(joystick) \ No newline at end of file diff --git a/opendbc/can/common.cc b/opendbc/can/common.cc index 9295db69303..1b6a114fd07 100644 --- a/opendbc/can/common.cc +++ b/opendbc/can/common.cc @@ -116,18 +116,14 @@ struct CrcInitializer { static CrcInitializer crcInitializer; -static const std::unordered_map> volkswagen_mqb_meb_crc_constants { +static const std::unordered_map> volkswagen_mqb_crc_constants { {0x40, {0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40}}, // Airbag_01 {0x86, {0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86}}, // LWI_01 {0x9F, {0xF5, 0xF5, 0xF5, 0xF5, 0xF5, 0xF5, 0xF5, 0xF5, 0xF5, 0xF5, 0xF5, 0xF5, 0xF5, 0xF5, 0xF5, 0xF5}}, // LH_EPS_03 {0xAD, {0x3F, 0x69, 0x39, 0xDC, 0x94, 0xF9, 0x14, 0x64, 0xD8, 0x6A, 0x34, 0xCE, 0xA2, 0x55, 0xB5, 0x2C}}, // Getriebe_11 - {0x0DB, {0x09, 0xFA, 0xCA, 0x8E, 0x62, 0xD5, 0xD1, 0xF0, 0x31, 0xA0, 0xAF, 0xDA, 0x4D, 0x1A, 0x0A, 0x97}}, // AWV_03 - {0xFC, {0x77, 0x5C, 0xA0, 0x89, 0x4B, 0x7C, 0xBB, 0xD6, 0x1F, 0x6C, 0x4F, 0xF6, 0x20, 0x2B, 0x43, 0xDD}}, // ESC_51 {0xFD, {0xB4, 0xEF, 0xF8, 0x49, 0x1E, 0xE5, 0xC2, 0xC0, 0x97, 0x19, 0x3C, 0xC9, 0xF1, 0x98, 0xD6, 0x61}}, // ESP_21 {0x101, {0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA}}, // ESP_02 - {0x102, {0xD7, 0x12, 0x85, 0x7E, 0x0B, 0x34, 0xFA, 0x16, 0x7A, 0x25, 0x2D, 0x8F, 0x04, 0x8E, 0x5D, 0x35}}, // ESC_50 {0x106, {0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07}}, // ESP_05 - {0x10B, {0x77, 0x5C, 0xA0, 0x89, 0x4B, 0x7C, 0xBB, 0xD6, 0x1F, 0x6C, 0x4F, 0xF6, 0x20, 0x2B, 0x43, 0xDD}}, // Motor_51 {0x116, {0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC}}, // ESP_10 {0x117, {0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16}}, // ACC_10 {0x120, {0xC4, 0xE2, 0x4F, 0xE4, 0xF8, 0x2F, 0x56, 0x81, 0x9F, 0xE5, 0x83, 0x44, 0x05, 0x3F, 0x97, 0xDF}}, // TSK_06 @@ -136,26 +132,17 @@ static const std::unordered_map> volkswagen_mq {0x126, {0xDA, 0xDA, 0xDA, 0xDA, 0xDA, 0xDA, 0xDA, 0xDA, 0xDA, 0xDA, 0xDA, 0xDA, 0xDA, 0xDA, 0xDA, 0xDA}}, // HCA_01 {0x12B, {0x6A, 0x38, 0xB4, 0x27, 0x22, 0xEF, 0xE1, 0xBB, 0xF8, 0x80, 0x84, 0x49, 0xC7, 0x9E, 0x1E, 0x2B}}, // GRA_ACC_01 {0x12E, {0xF8, 0xE5, 0x97, 0xC9, 0xD6, 0x07, 0x47, 0x21, 0x66, 0xDD, 0xCF, 0x6F, 0xA1, 0x94, 0x74, 0x63}}, // ACC_07 - {0x139, {0xED, 0x03, 0x1C, 0x13, 0xC6, 0x23, 0x78, 0x7A, 0x8B, 0x40, 0x14, 0x51, 0xBF, 0x68, 0x32, 0xBA}}, // VMM_02 - {0x13D, {0x20, 0xCA, 0x68, 0xD5, 0x1B, 0x31, 0xE2, 0xDA, 0x08, 0x0A, 0xD4, 0xDE, 0x9C, 0xE4, 0x35, 0x5B}}, // QFK_01 - {0x14C, {0x16, 0x35, 0x59, 0x15, 0x9A, 0x2A, 0x97, 0xB8, 0x0E, 0x4E, 0x30, 0xCC, 0xB3, 0x07, 0x01, 0xAD}}, // Motor_54 - {0x14D, {0x1A, 0x65, 0x81, 0x96, 0xC0, 0xDF, 0x11, 0x92, 0xD3, 0x61, 0xC6, 0x95, 0x8C, 0x29, 0x21, 0xB5}}, // ACC_18 {0x187, {0x7F, 0xED, 0x17, 0xC2, 0x7C, 0xEB, 0x44, 0x21, 0x01, 0xFA, 0xDB, 0x15, 0x4A, 0x6B, 0x23, 0x05}}, // Motor_EV_01 - {0x1A4, {0x69, 0xBB, 0x54, 0xE6, 0x4E, 0x46, 0x8D, 0x7B, 0xEA, 0x87, 0xE9, 0xB3, 0x63, 0xCE, 0xF8, 0xBF}}, // EA_01 {0x1AB, {0x13, 0x21, 0x9B, 0x6A, 0x9A, 0x62, 0xD4, 0x65, 0x18, 0xF1, 0xAB, 0x16, 0x32, 0x89, 0xE7, 0x26}}, // ESP_33 - {0x1F0, {0x2F, 0x3C, 0x22, 0x60, 0x18, 0xEB, 0x63, 0x76, 0xC5, 0x91, 0x0F, 0x27, 0x34, 0x04, 0x7F, 0x02}}, // EA_02 - {0x20A, {0x9D, 0xE8, 0x36, 0xA1, 0xCA, 0x3B, 0x1D, 0x33, 0xE0, 0xD5, 0xBB, 0x5F, 0xAE, 0x3C, 0x31, 0x9F}}, // EML_06 - {0x26B, {0xCE, 0xCC, 0xBD, 0x69, 0xA1, 0x3C, 0x18, 0x76, 0x0F, 0x04, 0xF2, 0x3A, 0x93, 0x24, 0x19, 0x51}}, // TA_01 {0x30C, {0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F}}, // ACC_02 {0x30F, {0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C}}, // SWA_01 {0x324, {0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27}}, // ACC_04 - {0x3BE, {0x1F, 0x28, 0xC6, 0x85, 0xE6, 0xF8, 0xB0, 0x19, 0x5B, 0x64, 0x35, 0x21, 0xE4, 0xF7, 0x9C, 0x24}}, // Motor_14 {0x3C0, {0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3}}, // Klemmen_Status_01 {0x3D5, {0xC5, 0x39, 0xC7, 0xF9, 0x92, 0xD8, 0x24, 0xCE, 0xF1, 0xB5, 0x7A, 0xC4, 0xBC, 0x60, 0xE3, 0xD1}}, // Licht_Anf_01 {0x65D, {0xAC, 0xB3, 0xAB, 0xEB, 0x7A, 0xE1, 0x3B, 0xF7, 0x73, 0xBA, 0x7C, 0x9E, 0x06, 0x5F, 0x02, 0xD9}}, // ESP_20 }; -unsigned int volkswagen_mqb_meb_checksum(uint32_t address, const Signal &sig, const std::vector &d) { +unsigned int volkswagen_mqb_checksum(uint32_t address, const Signal &sig, const std::vector &d) { // This is AUTOSAR E2E Profile 2, CRC-8H2F with a "data ID" (varying by message/counter) appended to the payload uint8_t crc = 0xFF; // CRC-8H2F initial value @@ -168,9 +155,8 @@ unsigned int volkswagen_mqb_meb_checksum(uint32_t address, const Signal &sig, co // Continue CRC over the "data ID" uint8_t counter = d[1] & 0x0F; - - auto crc_const = volkswagen_mqb_meb_crc_constants.find(address); - if (crc_const != volkswagen_mqb_meb_crc_constants.end()) { + auto crc_const = volkswagen_mqb_crc_constants.find(address); + if (crc_const != volkswagen_mqb_crc_constants.end()) { crc ^= crc_const->second[counter]; crc = crc8_lut_8h2f[crc]; } else { diff --git a/opendbc/can/common.h b/opendbc/can/common.h index aa5f72d0a30..247ac62aa26 100644 --- a/opendbc/can/common.h +++ b/opendbc/can/common.h @@ -23,7 +23,7 @@ unsigned int honda_checksum(uint32_t address, const Signal &sig, const std::vect unsigned int toyota_checksum(uint32_t address, const Signal &sig, const std::vector &d); unsigned int subaru_checksum(uint32_t address, const Signal &sig, const std::vector &d); unsigned int chrysler_checksum(uint32_t address, const Signal &sig, const std::vector &d); -unsigned int volkswagen_mqb_meb_checksum(uint32_t address, const Signal &sig, const std::vector &d); +unsigned int volkswagen_mqb_checksum(uint32_t address, const Signal &sig, const std::vector &d); unsigned int xor_checksum(uint32_t address, const Signal &sig, const std::vector &d); unsigned int hkg_can_fd_checksum(uint32_t address, const Signal &sig, const std::vector &d); unsigned int fca_giorgio_checksum(uint32_t address, const Signal &sig, const std::vector &d); diff --git a/opendbc/can/common.pxd b/opendbc/can/common.pxd index 0bfa436fd79..33e368a8398 100644 --- a/opendbc/can/common.pxd +++ b/opendbc/can/common.pxd @@ -19,7 +19,7 @@ cdef extern from "common_dbc.h": HONDA_CHECKSUM, TOYOTA_CHECKSUM, PEDAL_CHECKSUM, - VOLKSWAGEN_MQB_MEB_CHECKSUM, + VOLKSWAGEN_MQB_CHECKSUM, XOR_CHECKSUM, SUBARU_CHECKSUM, CHRYSLER_CHECKSUM @@ -80,9 +80,9 @@ cdef extern from "common.h": cdef cppclass CANParser: bool can_valid bool bus_timeout - CANParser(int, string, vector[pair[uint32_t, int]]) except + nogil - set[uint32_t] update(vector[CanData]&) except + nogil - MessageState *getMessageState(uint32_t address) nogil + CANParser(int, string, vector[pair[uint32_t, int]]) except + + set[uint32_t] update(vector[CanData]&) except + + MessageState *getMessageState(uint32_t address) cdef cppclass CANPacker: CANPacker(string) diff --git a/opendbc/can/common_dbc.h b/opendbc/can/common_dbc.h index 70a1b1f3fd4..0d2170ff5f9 100644 --- a/opendbc/can/common_dbc.h +++ b/opendbc/can/common_dbc.h @@ -16,7 +16,7 @@ enum SignalType { HONDA_CHECKSUM, TOYOTA_CHECKSUM, PEDAL_CHECKSUM, - VOLKSWAGEN_MQB_MEB_CHECKSUM, + VOLKSWAGEN_MQB_CHECKSUM, XOR_CHECKSUM, SUBARU_CHECKSUM, CHRYSLER_CHECKSUM, diff --git a/opendbc/can/dbc.cc b/opendbc/can/dbc.cc index 09c93b8924e..8f361af1fda 100644 --- a/opendbc/can/dbc.cc +++ b/opendbc/can/dbc.cc @@ -55,10 +55,10 @@ ChecksumState* get_checksum(const std::string& dbc_name) { s = new ChecksumState({4, 2, 3, 5, false, HONDA_CHECKSUM, &honda_checksum}); } else if (startswith(dbc_name, {"toyota_", "lexus_"})) { s = new ChecksumState({8, -1, 7, -1, false, TOYOTA_CHECKSUM, &toyota_checksum}); - } else if (startswith(dbc_name, "hyundai_canfd_generated")) { + } else if (startswith(dbc_name, "hyundai_canfd")) { s = new ChecksumState({16, -1, 0, -1, true, HKG_CAN_FD_CHECKSUM, &hkg_can_fd_checksum}); - } else if (startswith(dbc_name, {"vw_mqb_2010", "vw_mqbevo", "vw_meb"})) { - s = new ChecksumState({8, 4, 0, 0, true, VOLKSWAGEN_MQB_MEB_CHECKSUM, &volkswagen_mqb_meb_checksum}); + } else if (startswith(dbc_name, {"vw_mqb_2010", "vw_mqbevo"})) { + s = new ChecksumState({8, 4, 0, 0, true, VOLKSWAGEN_MQB_CHECKSUM, &volkswagen_mqb_checksum}); } else if (startswith(dbc_name, "vw_golf_mk4")) { s = new ChecksumState({8, 4, 0, -1, true, XOR_CHECKSUM, &xor_checksum}); } else if (startswith(dbc_name, "subaru_global_")) { diff --git a/opendbc/can/parser_pyx.pyx b/opendbc/can/parser_pyx.pyx index 6815ad5154d..f35995cd721 100644 --- a/opendbc/can/parser_pyx.pyx +++ b/opendbc/can/parser_pyx.pyx @@ -4,7 +4,7 @@ from libcpp.pair cimport pair from libcpp.string cimport string from libcpp.vector cimport vector -from libc.stdint cimport uint32_t, int +from libc.stdint cimport uint32_t from .common cimport CANParser as cpp_CANParser from .common cimport dbc_lookup, Msg, DBC, CanData @@ -61,19 +61,11 @@ cdef class CANParser: self.ts_nanos[address] = {name: 0.0 for name in signal_names} self.ts_nanos[name] = self.ts_nanos[address] - cdef string cpp_dbc_name - if isinstance(dbc_name, str): - cpp_dbc_name = (dbc_name).encode('utf-8') - else: - cpp_dbc_name = dbc_name # Assume bytes - cdef int cpp_bus = bus - with nogil: - self.can = new cpp_CANParser(cpp_bus, cpp_dbc_name, message_v) + self.can = new cpp_CANParser(bus, dbc_name, message_v) def __dealloc__(self): if self.can: - with nogil: - del self.can + del self.can def update_strings(self, strings, sendcan=False): # input format: @@ -103,16 +95,13 @@ cdef class CANParser: except TypeError: raise RuntimeError("invalid parameter") - with nogil: - updated_addrs = self.can.update(can_data_array) - + updated_addrs = self.can.update(can_data_array) for addr in updated_addrs: vl = self.vl[addr] vl_all = self.vl_all[addr] ts_nanos = self.ts_nanos[addr] - with nogil: - state = self.can.getMessageState(addr) + state = self.can.getMessageState(addr) for i in range(state.parse_sigs.size()): name = state.parse_sigs[i].name vl[name] = state.vals[i] @@ -123,17 +112,11 @@ cdef class CANParser: @property def can_valid(self): - cdef bint valid - with nogil: - valid = self.can.can_valid - return valid + return self.can.can_valid @property def bus_timeout(self): - cdef bint timeout - with nogil: - timeout = self.can.bus_timeout - return timeout + return self.can.bus_timeout cdef class CANDefine(): diff --git a/opendbc/car/CARS_template.md b/opendbc/car/CARS_template.md index c08b191f84e..d13f3a4b764 100644 --- a/opendbc/car/CARS_template.md +++ b/opendbc/car/CARS_template.md @@ -1,10 +1,10 @@ -# Support Information for {{all_car_docs | length}} Known Cars +# Support Information for {{car_docs_with_extras | length}} Known Cars |{{ExtraCarsColumn | map(attribute='value') | join('|') | replace(hardware_col_name, wide_hardware_col_name)}}| |---|---|---|{% for _ in range((ExtraCarsColumn | length) - 3) %}{{':---:|'}}{% endfor +%} -{% for car_docs in all_car_docs %} +{% for car_docs in car_docs_with_extras %} |{% for column in ExtraCarsColumn %}{{car_docs.get_extra_cars_column(column)}}|{% endfor %} {% endfor %} diff --git a/opendbc/car/__init__.py b/opendbc/car/__init__.py index dde58dd8cc7..2bd1c88c1be 100644 --- a/opendbc/car/__init__.py +++ b/opendbc/car/__init__.py @@ -1,5 +1,6 @@ # functions common among cars import numpy as np +from collections import namedtuple from dataclasses import dataclass, field from enum import IntFlag, ReprEnum, StrEnum, EnumType, auto from dataclasses import replace @@ -16,13 +17,7 @@ ACCELERATION_DUE_TO_GRAVITY = 9.81 # m/s^2 ButtonType = structs.CarState.ButtonEvent.Type - - -@dataclass -class AngleSteeringLimits: - STEER_ANGLE_MAX: float - ANGLE_RATE_LIMIT_UP: tuple[list[float], list[float]] - ANGLE_RATE_LIMIT_DOWN: tuple[list[float], list[float]] +AngleRateLimit = namedtuple('AngleRateLimit', ['speed_bp', 'angle_v']) def apply_hysteresis(val: float, val_steady: float, hyst_gap: float) -> float: @@ -146,20 +141,14 @@ def apply_meas_steer_torque_limits(apply_torque, apply_torque_last, motor_torque LIMITS.STEER_ERROR_MAX, LIMITS.STEER_MAX))) -def apply_std_steer_angle_limits(apply_angle: float, apply_angle_last: float, v_ego: float, steering_angle: float, - lat_active: bool, limits: AngleSteeringLimits) -> float: +def apply_std_steer_angle_limits(apply_angle, apply_angle_last, v_ego, LIMITS): # pick angle rate limits based on wind up/down steer_up = apply_angle_last * apply_angle >= 0. and abs(apply_angle) > abs(apply_angle_last) - rate_limits = limits.ANGLE_RATE_LIMIT_UP if steer_up else limits.ANGLE_RATE_LIMIT_DOWN - - angle_rate_lim = np.interp(v_ego, rate_limits[0], rate_limits[1]) - new_apply_angle = np.clip(apply_angle, apply_angle_last - angle_rate_lim, apply_angle_last + angle_rate_lim) - - # angle is current steering wheel angle when inactive on all angle cars - if not lat_active: - new_apply_angle = steering_angle + rate_limits = LIMITS.ANGLE_RATE_LIMIT_UP if steer_up else LIMITS.ANGLE_RATE_LIMIT_DOWN - return float(np.clip(new_apply_angle, -limits.STEER_ANGLE_MAX, limits.STEER_ANGLE_MAX)) + angle_rate_lim = np.interp(v_ego, rate_limits.speed_bp, rate_limits.angle_v) + angle_rate_lim = float(angle_rate_lim) + return float(np.clip(apply_angle, apply_angle_last - angle_rate_lim, apply_angle_last + angle_rate_lim)) def common_fault_avoidance(fault_condition: bool, request: bool, above_limit_frames: int, diff --git a/opendbc/car/body/carcontroller.py b/opendbc/car/body/carcontroller.py index 1394c301f50..39a6c8eca90 100644 --- a/opendbc/car/body/carcontroller.py +++ b/opendbc/car/body/carcontroller.py @@ -20,8 +20,8 @@ def __init__(self, dbc_names, CP): self.packer = CANPacker(dbc_names[Bus.main]) # PIDs - self.turn_pid = PIDController(110, k_i=11.5, rate=1 / DT_CTRL) - self.wheeled_speed_pid = PIDController(110, k_i=11.5, rate=1 / DT_CTRL) + self.turn_pid = PIDController(110, k_i=11.5, rate=1/DT_CTRL) + self.wheeled_speed_pid = PIDController(110, k_i=11.5, rate=1/DT_CTRL) self.torque_r_filtered = 0. self.torque_l_filtered = 0. @@ -43,7 +43,7 @@ def update(self, CC, CS, now_nanos): # Read these from the joystick # TODO: this isn't acceleration, okay? speed_desired = CC.actuators.accel / 5. - speed_diff_desired = -CC.actuators.torque / 2. + speed_diff_desired = -CC.actuators.steer / 2. speed_measured = SPEED_FROM_RPM * (CS.out.wheelSpeeds.fl + CS.out.wheelSpeeds.fr) / 2. speed_error = speed_desired - speed_measured @@ -75,8 +75,8 @@ def update(self, CC, CS, now_nanos): new_actuators = CC.actuators.as_builder() new_actuators.accel = torque_l - new_actuators.torque = torque_r - new_actuators.torqueOutputCan = torque_r + new_actuators.steer = torque_r + new_actuators.steerOutputCan = torque_r self.frame += 1 return new_actuators, can_sends diff --git a/opendbc/car/car.capnp b/opendbc/car/car.capnp index b1b968a3c99..93cf26554b2 100644 --- a/opendbc/car/car.capnp +++ b/opendbc/car/car.capnp @@ -348,14 +348,13 @@ struct CarControl { orientationNED @13 :List(Float32); angularVelocity @14 :List(Float32); - currentCurvature @17 :Float32; # From vehicle model cruiseControl @4 :CruiseControl; hudControl @5 :HUDControl; struct Actuators { # lateral commands, mutually exclusive - torque @2: Float32; # [0.0, 1.0] + steer @2: Float32; # [0.0, 1.0] steeringAngleDeg @3: Float32; curvature @7: Float32; @@ -366,7 +365,7 @@ struct CarControl { # these are only for logging the actual values sent to the car over CAN gas @0: Float32; # [0.0, 1.0] brake @1: Float32; # [0.0, 1.0] - torqueOutputCan @8: Float32; # value sent over can to the car + steerOutputCan @8: Float32; # value sent over can to the car speed @6: Float32; # m/s enum LongControlState @0xe40f3a917d908282{ @@ -627,7 +626,6 @@ struct CarParams { psa @31; fcaGiorgio @32; rivian @33; - volkswagenMeb @34; } enum SteerControlType { diff --git a/opendbc/car/car_helpers.py b/opendbc/car/car_helpers.py index ce22fffa5c9..bb8d9e213dd 100644 --- a/opendbc/car/car_helpers.py +++ b/opendbc/car/car_helpers.py @@ -7,8 +7,8 @@ from opendbc.car.structs import CarParams, CarParamsT from opendbc.car.fingerprints import eliminate_incompatible_cars, all_legacy_fingerprint_cars from opendbc.car.fw_versions import ObdCallback, get_fw_versions_ordered, get_present_ecus, match_fw_to_car +from opendbc.car.interfaces import get_interface_attr from opendbc.car.mock.values import CAR as MOCK -from opendbc.car.values import BRANDS from opendbc.car.vin import get_vin, is_valid_vin, VIN_UNKNOWN FRAME_FINGERPRINT = 100 # 1s @@ -30,9 +30,8 @@ def load_interfaces(brand_names): def _get_interface_names() -> dict[str, list[str]]: # returns a dict of brand name and its respective models brand_names = {} - for brand in BRANDS: - brand_name = brand.__module__.split('.')[-2] - brand_names[brand_name] = [model.value for model in brand] + for brand_name, brand_models in get_interface_attr("CAR").items(): + brand_names[brand_name] = [model.value for model in brand_models] return brand_names diff --git a/opendbc/car/carlog.py b/opendbc/car/carlog.py index 5683d2a3947..80ee7d3d4ca 100644 --- a/opendbc/car/carlog.py +++ b/opendbc/car/carlog.py @@ -6,7 +6,3 @@ carlog = logging.getLogger('carlog') carlog.setLevel(LOGPRINT) carlog.propagate = False - -handler = logging.StreamHandler() -handler.setFormatter(logging.Formatter('%(message)s')) -carlog.addHandler(handler) diff --git a/opendbc/car/ccp.py b/opendbc/car/ccp.py deleted file mode 100644 index 52ba4846374..00000000000 --- a/opendbc/car/ccp.py +++ /dev/null @@ -1,373 +0,0 @@ -import sys -import time -import struct -from enum import IntEnum, Enum -from dataclasses import dataclass - -@dataclass -class ExchangeStationIdsReturn: - id_length: int - data_type: int - available: int - protected: int - -@dataclass -class GetDaqListSizeReturn: - list_size: int - first_pid: int - -@dataclass -class GetSessionStatusReturn: - status: int - info: int | None - -@dataclass -class DiagnosticServiceReturn: - length: int - type: int - -@dataclass -class ActionServiceReturn: - length: int - type: int - -class COMMAND_CODE(IntEnum): - CONNECT = 0x01 - SET_MTA = 0x02 - DNLOAD = 0x03 - UPLOAD = 0x04 - TEST = 0x05 - START_STOP = 0x06 - DISCONNECT = 0x07 - START_STOP_ALL = 0x08 - GET_ACTIVE_CAL_PAGE = 0x09 - SET_S_STATUS = 0x0C - GET_S_STATUS = 0x0D - BUILD_CHKSUM = 0x0E - SHORT_UP = 0x0F - CLEAR_MEMORY = 0x10 - SELECT_CAL_PAGE = 0x11 - GET_SEED = 0x12 - UNLOCK = 0x13 - GET_DAQ_SIZE = 0x14 - SET_DAQ_PTR = 0x15 - WRITE_DAQ = 0x16 - EXCHANGE_ID = 0x17 - PROGRAM = 0x18 - MOVE = 0x19 - GET_CCP_VERSION = 0x1B - DIAG_SERVICE = 0x20 - ACTION_SERVICE = 0x21 - PROGRAM_6 = 0x22 - DNLOAD_6 = 0x23 - -COMMAND_RETURN_CODES = { - 0x00: "acknowledge / no error", - 0x01: "DAQ processor overload", - 0x10: "command processor busy", - 0x11: "DAQ processor busy", - 0x12: "internal timeout", - 0x18: "key request", - 0x19: "session status request", - 0x20: "cold start request", - 0x21: "cal. data init. request", - 0x22: "DAQ list init. request", - 0x23: "code update request", - 0x30: "unknown command", - 0x31: "command syntax", - 0x32: "parameter(s) out of range", - 0x33: "access denied", - 0x34: "overload", - 0x35: "access locked", - 0x36: "resource/function not available", -} - -class BYTE_ORDER(Enum): - LITTLE_ENDIAN = '<' - BIG_ENDIAN = '>' - -class CommandTimeoutError(Exception): - pass - -class CommandCounterError(Exception): - pass - -class CommandResponseError(Exception): - def __init__(self, message, return_code): - super().__init__() - self.message = message - self.return_code = return_code - - def __str__(self): - return self.message - -class CcpClient: - def __init__(self, panda, tx_addr: int, rx_addr: int, bus: int=0, byte_order: BYTE_ORDER=BYTE_ORDER.BIG_ENDIAN, debug=False): - self.tx_addr = tx_addr - self.rx_addr = rx_addr - self.can_bus = bus - self.byte_order = byte_order - self.debug = debug - self._panda = panda - self._command_counter = -1 - - def _send_cro(self, cmd: int, dat: bytes = b"") -> None: - self._command_counter = (self._command_counter + 1) & 0xFF - tx_data = (bytes([cmd, self._command_counter]) + dat).ljust(8, b"\x00") - if self.debug: - print(f"CAN-TX: {hex(self.tx_addr)} - 0x{bytes.hex(tx_data)}") - assert len(tx_data) == 8, "data is not 8 bytes" - self._panda.can_clear(self.can_bus) - self._panda.can_clear(0xFFFF) - self._panda.can_send(self.tx_addr, tx_data, self.can_bus) - - def _recv_dto(self, timeout: float) -> bytes: - start_time = time.time() - while time.time() - start_time < timeout: - msgs = self._panda.can_recv() or [] - if len(msgs) >= 256: - print("CAN RX buffer overflow!!!", file=sys.stderr) - for rx_addr, rx_data_bytearray, rx_bus in msgs: - if rx_bus == self.can_bus and rx_addr == self.rx_addr: - rx_data = bytes(rx_data_bytearray) - if self.debug: - print(f"CAN-RX: {hex(rx_addr)} - 0x{bytes.hex(rx_data)}") - assert len(rx_data) == 8, f"message length not 8: {len(rx_data)}" - - pid = rx_data[0] - if pid == 0xFF or pid == 0xFE: - err = rx_data[1] - err_desc = COMMAND_RETURN_CODES.get(err, "unknown error") - ctr = rx_data[2] - dat = rx_data[3:] - - if pid == 0xFF and self._command_counter != ctr: - raise CommandCounterError(f"counter invalid: {ctr} != {self._command_counter}") - - if err >= 0x10 and err <= 0x12: - if self.debug: - print(f"CCP-WAIT: {hex(err)} - {err_desc}") - start_time = time.time() - continue - - if err >= 0x30: - raise CommandResponseError(f"{hex(err)} - {err_desc}", err) - else: - dat = rx_data[1:] - - return dat - time.sleep(0.001) - - raise CommandTimeoutError("timeout waiting for response") - - # commands - def connect(self, station_addr: int) -> None: - if station_addr > 65535: - raise ValueError("station address must be less than 65536") - # NOTE: station address is always little endian - self._send_cro(COMMAND_CODE.CONNECT, struct.pack(" ExchangeStationIdsReturn: - self._send_cro(COMMAND_CODE.EXCHANGE_ID, device_id_info) - resp = self._recv_dto(0.025) - return ExchangeStationIdsReturn(id_length=resp[0], data_type=resp[1], available=resp[2], protected=resp[3]) - - def get_seed(self, resource_mask: int) -> bytes: - if resource_mask > 255: - raise ValueError("resource mask must be less than 256") - self._send_cro(COMMAND_CODE.GET_SEED, bytes([resource_mask])) - resp = self._recv_dto(0.025) - # protected = resp[0] == 0 - seed = resp[1:] - return seed - - def unlock(self, key: bytes) -> int: - if len(key) > 6: - raise ValueError("max key size is 6 bytes") - self._send_cro(COMMAND_CODE.UNLOCK, key) - resp = self._recv_dto(0.025) - status = resp[0] - return status - - def set_memory_transfer_address(self, mta_num: int, addr_ext: int, addr: int) -> None: - if mta_num > 255: - raise ValueError("MTA number must be less than 256") - if addr_ext > 255: - raise ValueError("address extension must be less than 256") - self._send_cro(COMMAND_CODE.SET_MTA, bytes([mta_num, addr_ext]) + struct.pack(f"{self.byte_order.value}I", addr)) - self._recv_dto(0.025) - - def download(self, data: bytes) -> int: - if len(data) > 5: - raise ValueError("max data size is 5 bytes") - self._send_cro(COMMAND_CODE.DNLOAD, bytes([len(data)]) + data) - resp = self._recv_dto(0.025) - # mta_addr_ext = resp[0] - mta_addr = struct.unpack(f"{self.byte_order.value}I", resp[1:5])[0] - return mta_addr # type: ignore - - def download_6_bytes(self, data: bytes) -> int: - if len(data) != 6: - raise ValueError("data size must be 6 bytes") - self._send_cro(COMMAND_CODE.DNLOAD_6, data) - resp = self._recv_dto(0.025) - # mta_addr_ext = resp[0] - mta_addr = struct.unpack(f"{self.byte_order.value}I", resp[1:5])[0] - return mta_addr # type: ignore - - def upload(self, size: int) -> bytes: - if size > 5: - raise ValueError("size must be less than 6") - self._send_cro(COMMAND_CODE.UPLOAD, bytes([size])) - return self._recv_dto(0.025)[:size] - - def short_upload(self, size: int, addr_ext: int, addr: int) -> bytes: - if size > 5: - raise ValueError("size must be less than 6") - if addr_ext > 255: - raise ValueError("address extension must be less than 256") - self._send_cro(COMMAND_CODE.SHORT_UP, bytes([size, addr_ext]) + struct.pack(f"{self.byte_order.value}I", addr)) - return self._recv_dto(0.025)[:size] - - def select_calibration_page(self) -> None: - self._send_cro(COMMAND_CODE.SELECT_CAL_PAGE) - self._recv_dto(0.025) - - def get_daq_list_size(self, list_num: int, can_id: int = 0) -> GetDaqListSizeReturn: - if list_num > 255: - raise ValueError("list number must be less than 256") - self._send_cro(COMMAND_CODE.GET_DAQ_SIZE, bytes([list_num, 0]) + struct.pack(f"{self.byte_order.value}I", can_id)) - resp = self._recv_dto(0.025) - return GetDaqListSizeReturn(list_size=resp[0], first_pid=resp[1]) - - def set_daq_list_pointer(self, list_num: int, odt_num: int, element_num: int) -> None: - if list_num > 255: - raise ValueError("list number must be less than 256") - if odt_num > 255: - raise ValueError("ODT number must be less than 256") - if element_num > 255: - raise ValueError("element number must be less than 256") - self._send_cro(COMMAND_CODE.SET_DAQ_PTR, bytes([list_num, odt_num, element_num])) - self._recv_dto(0.025) - - def write_daq_list_entry(self, size: int, addr_ext: int, addr: int) -> None: - if size > 255: - raise ValueError("size must be less than 256") - if addr_ext > 255: - raise ValueError("address extension must be less than 256") - self._send_cro(COMMAND_CODE.WRITE_DAQ, bytes([size, addr_ext]) + struct.pack(f"{self.byte_order.value}I", addr)) - self._recv_dto(0.025) - - def start_stop_transmission(self, mode: int, list_num: int, odt_num: int, channel_num: int, rate_prescaler: int = 0) -> None: - if mode > 255: - raise ValueError("mode must be less than 256") - if list_num > 255: - raise ValueError("list number must be less than 256") - if odt_num > 255: - raise ValueError("ODT number must be less than 256") - if channel_num > 255: - raise ValueError("channel number must be less than 256") - if rate_prescaler > 65535: - raise ValueError("rate prescaler must be less than 65536") - self._send_cro(COMMAND_CODE.START_STOP, bytes([mode, list_num, odt_num, channel_num]) + struct.pack(f"{self.byte_order.value}H", rate_prescaler)) - self._recv_dto(0.025) - - def disconnect(self, station_addr: int, temporary: bool = False) -> None: - if station_addr > 65535: - raise ValueError("station address must be less than 65536") - # NOTE: station address is always little endian - self._send_cro(COMMAND_CODE.DISCONNECT, bytes([int(not temporary), 0x00]) + struct.pack(" None: - if status > 255: - raise ValueError("status must be less than 256") - self._send_cro(COMMAND_CODE.SET_S_STATUS, bytes([status])) - self._recv_dto(0.025) - - def get_session_status(self) -> GetSessionStatusReturn: - self._send_cro(COMMAND_CODE.GET_S_STATUS) - resp = self._recv_dto(0.025) - info = resp[2] if resp[1] else None - return GetSessionStatusReturn(status=resp[0], info=info) - - def build_checksum(self, size: int) -> bytes: - self._send_cro(COMMAND_CODE.BUILD_CHKSUM, struct.pack(f"{self.byte_order.value}I", size)) - resp = self._recv_dto(30.0) - chksum_size = resp[0] - assert chksum_size <= 4, "checksum more than 4 bytes" - chksum = resp[1:1+chksum_size] - return chksum - - def clear_memory(self, size: int) -> None: - self._send_cro(COMMAND_CODE.CLEAR_MEMORY, struct.pack(f"{self.byte_order.value}I", size)) - self._recv_dto(30.0) - - def program(self, size: int, data: bytes) -> int: - if size > 5: - raise ValueError("size must be less than 6") - if len(data) > 5: - raise ValueError("max data size is 5 bytes") - self._send_cro(COMMAND_CODE.PROGRAM, bytes([size]) + data) - resp = self._recv_dto(0.1) - # mta_addr_ext = resp[0] - mta_addr = struct.unpack(f"{self.byte_order.value}I", resp[1:5])[0] - return mta_addr # type: ignore - - def program_6_bytes(self, data: bytes) -> int: - if len(data) != 6: - raise ValueError("data size must be 6 bytes") - self._send_cro(COMMAND_CODE.PROGRAM_6, data) - resp = self._recv_dto(0.1) - # mta_addr_ext = resp[0] - mta_addr = struct.unpack(f"{self.byte_order.value}I", resp[1:5])[0] - return mta_addr # type: ignore - - def move_memory_block(self, size: int) -> None: - self._send_cro(COMMAND_CODE.MOVE, struct.pack(f"{self.byte_order.value}I", size)) - self._recv_dto(0.025) - - def diagnostic_service(self, service_num: int, data: bytes = b"") -> DiagnosticServiceReturn: - if service_num > 65535: - raise ValueError("service number must be less than 65536") - if len(data) > 4: - raise ValueError("max data size is 4 bytes") - self._send_cro(COMMAND_CODE.DIAG_SERVICE, struct.pack(f"{self.byte_order.value}H", service_num) + data) - resp = self._recv_dto(0.025) - return DiagnosticServiceReturn(length=resp[0], type=resp[1]) - - def action_service(self, service_num: int, data: bytes = b"") -> ActionServiceReturn: - if service_num > 65535: - raise ValueError("service number must be less than 65536") - if len(data) > 4: - raise ValueError("max data size is 4 bytes") - self._send_cro(COMMAND_CODE.ACTION_SERVICE, struct.pack(f"{self.byte_order.value}H", service_num) + data) - resp = self._recv_dto(0.025) - return ActionServiceReturn(length=resp[0], type=resp[1]) - - def test_availability(self, station_addr: int) -> None: - if station_addr > 65535: - raise ValueError("station address must be less than 65536") - # NOTE: station address is always little endian - self._send_cro(COMMAND_CODE.TEST, struct.pack(" None: - if mode > 255: - raise ValueError("mode must be less than 256") - self._send_cro(COMMAND_CODE.START_STOP_ALL, bytes([mode])) - self._recv_dto(0.025) - - def get_active_calibration_page(self): - self._send_cro(COMMAND_CODE.GET_ACTIVE_CAL_PAGE) - resp = self._recv_dto(0.025) - # cal_addr_ext = resp[0] - cal_addr = struct.unpack(f"{self.byte_order.value}I", resp[1:5])[0] - return cal_addr - - def get_version(self, desired_version: float = 2.1) -> float: - major, minor = map(int, str(desired_version).split(".")) - self._send_cro(COMMAND_CODE.GET_CCP_VERSION, bytes([major, minor])) - resp = self._recv_dto(0.025) - return float(f"{resp[0]}.{resp[1]}") diff --git a/opendbc/car/chrysler/carcontroller.py b/opendbc/car/chrysler/carcontroller.py index 778c28f383c..62ceb154825 100644 --- a/opendbc/car/chrysler/carcontroller.py +++ b/opendbc/car/chrysler/carcontroller.py @@ -8,7 +8,7 @@ class CarController(CarControllerBase): def __init__(self, dbc_names, CP): super().__init__(dbc_names, CP) - self.apply_torque_last = 0 + self.apply_steer_last = 0 self.hud_count = 0 self.last_lkas_falling_edge = 0 @@ -24,7 +24,7 @@ def update(self, CC, CS, now_nanos): lkas_active = CC.latActive and self.lkas_control_bit_prev # cruise buttons - if (self.frame - self.last_button_frame) * DT_CTRL > 0.05: + if (self.frame - self.last_button_frame)*DT_CTRL > 0.05: das_bus = 2 if self.CP.carFingerprint in RAM_CARS else 0 # ACC cancellation @@ -66,18 +66,18 @@ def update(self, CC, CS, now_nanos): self.lkas_control_bit_prev = lkas_control_bit # steer torque - new_torque = int(round(CC.actuators.torque * self.params.STEER_MAX)) - apply_torque = apply_meas_steer_torque_limits(new_torque, self.apply_torque_last, CS.out.steeringTorqueEps, self.params) + new_steer = int(round(CC.actuators.steer * self.params.STEER_MAX)) + apply_steer = apply_meas_steer_torque_limits(new_steer, self.apply_steer_last, CS.out.steeringTorqueEps, self.params) if not lkas_active or not lkas_control_bit: - apply_torque = 0 - self.apply_torque_last = apply_torque + apply_steer = 0 + self.apply_steer_last = apply_steer - can_sends.append(chryslercan.create_lkas_command(self.packer, self.CP, int(apply_torque), lkas_control_bit)) + can_sends.append(chryslercan.create_lkas_command(self.packer, self.CP, int(apply_steer), lkas_control_bit)) self.frame += 1 new_actuators = CC.actuators.as_builder() - new_actuators.torque = self.apply_torque_last / self.params.STEER_MAX - new_actuators.torqueOutputCan = self.apply_torque_last + new_actuators.steer = self.apply_steer_last / self.params.STEER_MAX + new_actuators.steerOutputCan = self.apply_steer_last return new_actuators, can_sends diff --git a/opendbc/car/chrysler/chryslercan.py b/opendbc/car/chrysler/chryslercan.py index 1469e563a1b..8a0755ac5d6 100644 --- a/opendbc/car/chrysler/chryslercan.py +++ b/opendbc/car/chrysler/chryslercan.py @@ -52,11 +52,11 @@ def create_lkas_hud(packer, CP, lkas_active, hud_alert, hud_count, car_model, au return packer.make_can_msg("DAS_6", 0, values) -def create_lkas_command(packer, CP, apply_torque, lkas_control_bit): +def create_lkas_command(packer, CP, apply_steer, lkas_control_bit): # LKAS_COMMAND Lane-keeping signal to turn the wheel enabled_val = 2 if CP.carFingerprint in RAM_CARS else 1 values = { - "STEERING_TORQUE": apply_torque, + "STEERING_TORQUE": apply_steer, "LKAS_CONTROL_BIT": enabled_val if lkas_control_bit else 0, } return packer.make_can_msg("LKAS_COMMAND", 0, values) diff --git a/opendbc/car/chrysler/interface.py b/opendbc/car/chrysler/interface.py index 1235ad37fd5..9fcd77ad6b2 100755 --- a/opendbc/car/chrysler/interface.py +++ b/opendbc/car/chrysler/interface.py @@ -18,9 +18,9 @@ def _get_params(ret: structs.CarParams, candidate, fingerprint, car_fw, experime # safety config ret.safetyConfigs = [get_safety_config(structs.CarParams.SafetyModel.chrysler)] if candidate in RAM_HD: - ret.safetyConfigs[0].safetyParam |= ChryslerSafetyFlags.RAM_HD.value + ret.safetyConfigs[0].safetyParam |= ChryslerSafetyFlags.FLAG_CHRYSLER_RAM_HD.value elif candidate in RAM_DT: - ret.safetyConfigs[0].safetyParam |= ChryslerSafetyFlags.RAM_DT.value + ret.safetyConfigs[0].safetyParam |= ChryslerSafetyFlags.FLAG_CHRYSLER_RAM_DT.value CarInterfaceBase.configure_torque_tune(candidate, ret.lateralTuning) if candidate not in RAM_CARS: diff --git a/opendbc/car/chrysler/values.py b/opendbc/car/chrysler/values.py index 50dffe984a2..d88a5c761d1 100644 --- a/opendbc/car/chrysler/values.py +++ b/opendbc/car/chrysler/values.py @@ -10,8 +10,8 @@ class ChryslerSafetyFlags(IntFlag): - RAM_DT = 1 - RAM_HD = 2 + FLAG_CHRYSLER_RAM_DT = 1 + FLAG_CHRYSLER_RAM_HD = 2 class ChryslerFlags(IntFlag): diff --git a/opendbc/car/docs.py b/opendbc/car/docs.py index 07fe514eceb..5287fa1c2a3 100755 --- a/opendbc/car/docs.py +++ b/opendbc/car/docs.py @@ -11,10 +11,9 @@ from opendbc.car.common.basedir import BASEDIR from opendbc.car import gen_empty_fingerprint from opendbc.car.structs import CarParams -from opendbc.car.docs_definitions import BaseCarHarness, CarDocs, Device, ExtraCarDocs, Column, ExtraCarsColumn, CommonFootnote, PartType, SupportType -from opendbc.car.car_helpers import interfaces -from opendbc.car.interfaces import get_interface_attr -from opendbc.car.values import Platform +from opendbc.car.docs_definitions import CarDocs, Device, ExtraCarDocs, Column, ExtraCarsColumn, CommonFootnote, PartType +from opendbc.car.car_helpers import interfaces, get_interface_attr +from opendbc.car.values import Platform, PLATFORMS from opendbc.car.mock.values import CAR as MOCK from opendbc.car.extra_cars import CAR as EXTRA @@ -22,17 +21,16 @@ EXTRA_CARS_MD_OUT = os.path.join(BASEDIR, "../", "../", "docs", "CARS.md") EXTRA_CARS_MD_TEMPLATE = os.path.join(BASEDIR, "CARS_template.md") -# TODO: merge these platforms into normal car ports with SupportType flag ExtraPlatform = Platform | EXTRA EXTRA_BRANDS = get_args(ExtraPlatform) EXTRA_PLATFORMS: dict[str, ExtraPlatform] = {str(platform): platform for brand in EXTRA_BRANDS for platform in brand} -def get_params_for_docs(platform) -> CarParams: - cp_platform = platform if platform in interfaces else MOCK.MOCK - CP: CarParams = interfaces[cp_platform][0].get_params(cp_platform, fingerprint=gen_empty_fingerprint(), - car_fw=[CarParams.CarFw(ecu=CarParams.Ecu.unknown)], - experimental_long=True, docs=True) +def get_params_for_docs(model, platform) -> CarParams: + cp_model, cp_platform = (model, platform) if model in interfaces else ("MOCK", MOCK.MOCK) + CP: CarParams = interfaces[cp_model][0].get_params(cp_platform, fingerprint=gen_empty_fingerprint(), + car_fw=[CarParams.CarFw(ecu=CarParams.Ecu.unknown)], + experimental_long=True, docs=True) return CP @@ -43,13 +41,13 @@ def get_all_footnotes() -> dict[Enum, int]: return {fn: idx + 1 for idx, fn in enumerate(all_footnotes)} -def build_sorted_car_docs_list(platforms, footnotes=None): +def build_sorted_car_docs_list(platforms, footnotes=None, include_dashcam=False): collected_car_docs: list[CarDocs | ExtraCarDocs] = [] - for platform in platforms.values(): + for model, platform in platforms.items(): car_docs = platform.config.car_docs - CP = get_params_for_docs(platform) + CP = get_params_for_docs(model, platform) - if not len(car_docs): + if (CP.dashcamOnly and not include_dashcam) or not len(car_docs): continue # A platform can include multiple car models @@ -67,7 +65,12 @@ def build_sorted_car_docs_list(platforms, footnotes=None): # CAUTION: This function is imported by shop.comma.ai and comma.ai/vehicles, test changes carefully def get_all_car_docs() -> list[CarDocs]: collected_footnotes = get_all_footnotes() - sorted_list: list[CarDocs] = build_sorted_car_docs_list(EXTRA_PLATFORMS, footnotes=collected_footnotes) + sorted_list: list[CarDocs] = build_sorted_car_docs_list(PLATFORMS, footnotes=collected_footnotes) + return sorted_list + + +def get_car_docs_with_extras() -> list[CarDocs | ExtraCarDocs]: + sorted_list: list[CarDocs] = build_sorted_car_docs_list(EXTRA_PLATFORMS, include_dashcam=True) return sorted_list @@ -86,8 +89,16 @@ def generate_cars_md(all_car_docs: list[CarDocs], template_fn: str) -> str: footnotes = [fn.value.text for fn in get_all_footnotes()] cars_md: str = template.render(all_car_docs=all_car_docs, PartType=PartType, group_by_make=group_by_make, footnotes=footnotes, - Device=Device, Column=Column, ExtraCarsColumn=ExtraCarsColumn, - BaseCarHarness=BaseCarHarness, SupportType=SupportType) + Device=Device, Column=Column) + return cars_md + + +def generate_cars_md_with_extras(car_docs_with_extras: list[CarDocs | ExtraCarDocs], template_fn: str) -> str: + with open(template_fn) as f: + template = jinja2.Template(f.read(), trim_blocks=True, lstrip_blocks=True) + + cars_md: str = template.render(car_docs_with_extras=car_docs_with_extras, PartType=PartType, + group_by_make=group_by_make, ExtraCarsColumn=ExtraCarsColumn) return cars_md @@ -100,5 +111,5 @@ def generate_cars_md(all_car_docs: list[CarDocs], template_fn: str) -> str: args = parser.parse_args() with open(args.out, 'w') as f: - f.write(generate_cars_md(get_all_car_docs(), args.template)) + f.write(generate_cars_md_with_extras(get_car_docs_with_extras(), args.template)) print(f"Generated and written to {args.out}") diff --git a/opendbc/car/docs_definitions.py b/opendbc/car/docs_definitions.py index bf44cd3d5a9..d51ea1887c9 100644 --- a/opendbc/car/docs_definitions.py +++ b/opendbc/car/docs_definitions.py @@ -98,7 +98,6 @@ class CarHarness(EnumBase): nidec = BaseCarHarness("Honda Nidec connector") bosch_a = BaseCarHarness("Honda Bosch A connector") bosch_b = BaseCarHarness("Honda Bosch B connector") - bosch_c = BaseCarHarness("Honda Bosch C connector") toyota_a = BaseCarHarness("Toyota A connector") toyota_b = BaseCarHarness("Toyota B connector") subaru_a = BaseCarHarness("Subaru A connector") @@ -136,9 +135,7 @@ class CarHarness(EnumBase): mazda = BaseCarHarness("Mazda connector") ford_q3 = BaseCarHarness("Ford Q3 connector") ford_q4 = BaseCarHarness("Ford Q4 connector", parts=[Accessory.harness_box, Accessory.comma_power_v2, Cable.long_obdc_cable, Cable.usbc_coupler]) - rivian = BaseCarHarness("Rivian A connector", parts=[Accessory.harness_box, Cable.long_obdc_cable, Cable.usbc_coupler]) - tesla_a = BaseCarHarness("Tesla A connector", parts=[Accessory.harness_box, Cable.long_obdc_cable, Cable.usbc_coupler]) - tesla_b = BaseCarHarness("Tesla B connector", parts=[Accessory.harness_box, Cable.long_obdc_cable, Cable.usbc_coupler]) + rivian = BaseCarHarness("Rivian connector") class Device(EnumBase): @@ -196,7 +193,7 @@ def all_parts(self): class CommonFootnote(Enum): EXP_LONG_AVAIL = CarFootnote( "openpilot Longitudinal Control (Alpha) is available behind a toggle; " + - "the toggle is only available in non-release branches such as `devel` or `nightly-dev`.", + "the toggle is only available in non-release branches such as `devel` or `master-ci`.", Column.LONGITUDINAL, docs_only=True) EXP_LONG_DSU = CarFootnote( "By default, this car will use the stock Adaptive Cruise Control (ACC) for longitudinal control. " + @@ -381,7 +378,7 @@ def get_detail_sentence(self, CP): sentence_builder += " This car may not be able to take tight turns on its own." # experimental mode - exp_link = "Experimental mode" + exp_link = "Experimental mode" if CP.openpilotLongitudinalControl and not CP.experimentalLongitudinalAvailable: sentence_builder += f" Traffic light and stop sign handling is also available in {exp_link}." @@ -389,7 +386,7 @@ def get_detail_sentence(self, CP): else: if CP.carFingerprint == "COMMA_BODY": - return "The body is a robotics dev kit that can run openpilot. Learn more." + return "The body is a robotics dev kit that can run openpilot. Learn more." else: raise Exception(f"This notCar does not have a detail sentence: {CP.carFingerprint}") diff --git a/opendbc/car/fingerprints.py b/opendbc/car/fingerprints.py index d9ced619abc..4619eb5443c 100644 --- a/opendbc/car/fingerprints.py +++ b/opendbc/car/fingerprints.py @@ -48,6 +48,11 @@ def eliminate_incompatible_cars(msg, candidate_cars): return compatible_cars +def all_known_cars(): + """Returns a list of all known car strings.""" + return list({*FW_VERSIONS.keys(), *_FINGERPRINTS.keys()}) + + def all_legacy_fingerprint_cars(): """Returns a list of all known car strings, FPv1 only.""" return list(_FINGERPRINTS.keys()) diff --git a/opendbc/car/ford/carcontroller.py b/opendbc/car/ford/carcontroller.py index 1f5644cbe06..0726388d748 100644 --- a/opendbc/car/ford/carcontroller.py +++ b/opendbc/car/ford/carcontroller.py @@ -9,32 +9,17 @@ LongCtrlState = structs.CarControl.Actuators.LongControlState VisualAlert = structs.CarControl.HUDControl.VisualAlert -# ISO 11270 -ISO_LATERAL_ACCEL = 3.0 # m/s^2 # TODO: import from test lateral limits file? -# Limit to average banked road since safety doesn't have the roll -EARTH_G = 9.81 -AVERAGE_ROAD_ROLL = 0.06 # ~3.4 degrees, 6% superelevation -MAX_LATERAL_ACCEL = ISO_LATERAL_ACCEL - (EARTH_G * AVERAGE_ROAD_ROLL) # ~2.4 m/s^2 - - -def apply_ford_curvature_limits(apply_curvature, apply_curvature_last, current_curvature, v_ego_raw, steering_angle, lat_active, CP): +def apply_ford_curvature_limits(apply_curvature, apply_curvature_last, current_curvature, v_ego_raw): # No blending at low speed due to lack of torque wind-up and inaccurate current curvature if v_ego_raw > 9: apply_curvature = np.clip(apply_curvature, current_curvature - CarControllerParams.CURVATURE_ERROR, - current_curvature + CarControllerParams.CURVATURE_ERROR) + current_curvature + CarControllerParams.CURVATURE_ERROR) # Curvature rate limit after driver torque limit - apply_curvature = apply_std_steer_angle_limits(apply_curvature, apply_curvature_last, v_ego_raw, steering_angle, lat_active, CarControllerParams.ANGLE_LIMITS) - - # Ford Q4/CAN FD has more torque available compared to Q3/CAN so we limit it based on lateral acceleration. - # Safety is not aware of the road roll so we subtract a conservative amount at all times - if CP.flags & FordFlags.CANFD: - # Limit curvature to conservative max lateral acceleration - curvature_accel_limit = MAX_LATERAL_ACCEL / (max(v_ego_raw, 1) ** 2) - apply_curvature = float(np.clip(apply_curvature, -curvature_accel_limit, curvature_accel_limit)) + apply_curvature = apply_std_steer_angle_limits(apply_curvature, apply_curvature_last, v_ego_raw, CarControllerParams) - return apply_curvature + return float(np.clip(apply_curvature, -CarControllerParams.CURVATURE_MAX, CarControllerParams.CURVATURE_MAX)) def apply_creep_compensation(accel: float, v_ego: float) -> float: @@ -85,10 +70,14 @@ def update(self, CC, CS, now_nanos): ### lateral control ### # send steer msg at 20Hz if (self.frame % CarControllerParams.STEER_STEP) == 0: - # apply rate limits, curvature error limit, and clip to signal range - current_curvature = -CS.out.yawRate / max(CS.out.vEgoRaw, 0.1) - self.apply_curvature_last = apply_ford_curvature_limits(actuators.curvature, self.apply_curvature_last, current_curvature, - CS.out.vEgoRaw, 0., CC.latActive, self.CP) + if CC.latActive: + # apply rate limits, curvature error limit, and clip to signal range + current_curvature = -CS.out.yawRate / max(CS.out.vEgoRaw, 0.1) + apply_curvature = apply_ford_curvature_limits(actuators.curvature, self.apply_curvature_last, current_curvature, CS.out.vEgoRaw) + else: + apply_curvature = 0. + + self.apply_curvature_last = apply_curvature if self.CP.flags & FordFlags.CANFD: # TODO: extended mode @@ -99,9 +88,9 @@ def update(self, CC, CS, now_nanos): # https://www.f150gen14.com/forum/threads/introducing-bluepilot-a-ford-specific-fork-for-comma3x-openpilot.24241/#post-457706 mode = 1 if CC.latActive else 0 counter = (self.frame // CarControllerParams.STEER_STEP) % 0x10 - can_sends.append(fordcan.create_lat_ctl2_msg(self.packer, self.CAN, mode, 0., 0., -self.apply_curvature_last, 0., counter)) + can_sends.append(fordcan.create_lat_ctl2_msg(self.packer, self.CAN, mode, 0., 0., -apply_curvature, 0., counter)) else: - can_sends.append(fordcan.create_lat_ctl_msg(self.packer, self.CAN, CC.latActive, 0., 0., -self.apply_curvature_last, 0.)) + can_sends.append(fordcan.create_lat_ctl_msg(self.packer, self.CAN, CC.latActive, 0., 0., -apply_curvature, 0.)) # send lka msg at 33Hz if (self.frame % CarControllerParams.LKA_STEP) == 0: diff --git a/opendbc/car/ford/carstate.py b/opendbc/car/ford/carstate.py index b273137af15..620f0e6ac6e 100644 --- a/opendbc/car/ford/carstate.py +++ b/opendbc/car/ford/carstate.py @@ -19,7 +19,6 @@ def __init__(self, CP): self.shifter_values = can_define.dv["PowertrainData_10"]["TrnRng_D_Rq"] self.distance_button = 0 - self.lc_button = 0 def update(self, can_parsers) -> structs.CarState: cp = can_parsers[Bus.pt] @@ -92,9 +91,7 @@ def update(self, can_parsers) -> structs.CarState: # TODO: block this going to the camera otherwise it will enable stock TJA ret.genericToggle = bool(cp.vl["Steering_Data_FD1"]["TjaButtnOnOffPress"]) prev_distance_button = self.distance_button - prev_lc_button = self.lc_button self.distance_button = cp.vl["Steering_Data_FD1"]["AccButtnGapTogglePress"] - self.lc_button = bool(cp.vl["Steering_Data_FD1"]["TjaButtnOnOffPress"]) # lock info ret.doorOpen = any([cp.vl["BodyInfo_3_FD1"]["DrStatDrv_B_Actl"], cp.vl["BodyInfo_3_FD1"]["DrStatPsngr_B_Actl"], @@ -113,10 +110,7 @@ def update(self, can_parsers) -> structs.CarState: self.acc_tja_status_stock_values = cp_cam.vl["ACCDATA_3"] self.lkas_status_stock_values = cp_cam.vl["IPMA_Data"] - ret.buttonEvents = [ - *create_button_events(self.distance_button, prev_distance_button, {1: ButtonType.gapAdjustCruise}), - *create_button_events(self.lc_button, prev_lc_button, {1: ButtonType.lkas}), - ] + ret.buttonEvents = create_button_events(self.distance_button, prev_distance_button, {1: ButtonType.gapAdjustCruise}) return ret diff --git a/opendbc/car/ford/fingerprints.py b/opendbc/car/ford/fingerprints.py index 03eedb15026..3449220dad1 100644 --- a/opendbc/car/ford/fingerprints.py +++ b/opendbc/car/ford/fingerprints.py @@ -81,8 +81,6 @@ ], (Ecu.abs, 0x760, None): [ b'PL34-2D053-CA\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', - b'PL34-2D053-CC\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', - b'PL3V-2D053-BB\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', ], (Ecu.fwdRadar, 0x764, None): [ b'ML3T-14D049-AL\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', @@ -90,7 +88,6 @@ (Ecu.fwdCamera, 0x706, None): [ b'ML3T-14H102-ABR\x00\x00\x00\x00\x00\x00\x00\x00\x00', b'PJ6T-14H102-ABJ\x00\x00\x00\x00\x00\x00\x00\x00\x00', - b'RJ6T-14H102-ACJ\x00\x00\x00\x00\x00\x00\x00\x00\x00', ], }, CAR.FORD_F_150_LIGHTNING_MK1: { @@ -99,20 +96,15 @@ ], (Ecu.fwdCamera, 0x706, None): [ b'ML3T-14H102-ABT\x00\x00\x00\x00\x00\x00\x00\x00\x00', - b'RJ6T-14H102-BBC\x00\x00\x00\x00\x00\x00\x00\x00\x00', ], (Ecu.fwdRadar, 0x764, None): [ b'ML3T-14D049-AL\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', ], - (Ecu.eps, 0x730, None): [ - b'RL38-14D003-AA\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', - ], }, CAR.FORD_MUSTANG_MACH_E_MK1: { (Ecu.eps, 0x730, None): [ b'LJ9C-14D003-AM\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', b'LJ9C-14D003-CC\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', - b'LJ9C-14D003-GA\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', ], (Ecu.abs, 0x760, None): [ b'LK9C-2D053-CK\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', @@ -122,7 +114,6 @@ ], (Ecu.fwdCamera, 0x706, None): [ b'ML3T-14H102-ABS\x00\x00\x00\x00\x00\x00\x00\x00\x00', - b'RJ6T-14H102-BAE\x00\x00\x00\x00\x00\x00\x00\x00\x00', ], }, CAR.FORD_FOCUS_MK4: { diff --git a/opendbc/car/ford/interface.py b/opendbc/car/ford/interface.py index ef215f0dc90..26a18ea4cab 100644 --- a/opendbc/car/ford/interface.py +++ b/opendbc/car/ford/interface.py @@ -1,6 +1,5 @@ import numpy as np from opendbc.car import Bus, get_safety_config, structs -from opendbc.car.carlog import carlog from opendbc.car.common.conversions import Conversions as CV from opendbc.car.ford.fordcan import CanBus from opendbc.car.ford.values import CarControllerParams, DBC, Ecu, FordFlags, RADAR, FordSafetyFlags @@ -21,6 +20,7 @@ def get_pid_accel_limits(CP, current_speed, cruise_speed): @staticmethod def _get_params(ret: structs.CarParams, candidate, fingerprint, car_fw, experimental_long, docs) -> structs.CarParams: ret.brand = "ford" + ret.dashcamOnly = bool(ret.flags & FordFlags.CANFD) ret.radarUnavailable = Bus.radar not in DBC[candidate] ret.steerControlType = structs.CarParams.SteerControlType.angle @@ -41,33 +41,25 @@ def _get_params(ret: structs.CarParams, candidate, fingerprint, car_fw, experime cfgs.insert(0, get_safety_config(structs.CarParams.SafetyModel.noOutput)) ret.safetyConfigs = cfgs + # TODO: verify stock AEB compatibility and longitudinal limit safety before shipping to release ret.experimentalLongitudinalAvailable = ret.radarUnavailable if experimental_long or not ret.radarUnavailable: - ret.safetyConfigs[-1].safetyParam |= FordSafetyFlags.LONG_CONTROL.value + ret.safetyConfigs[-1].safetyParam |= FordSafetyFlags.FLAG_FORD_LONG_CONTROL.value ret.openpilotLongitudinalControl = True if ret.flags & FordFlags.CANFD: - ret.safetyConfigs[-1].safetyParam |= FordSafetyFlags.CANFD.value - - # TRON (SecOC) platforms are not supported - # LateralMotionControl2, ACCDATA are 16 bytes on these platforms - if len(fingerprint[CAN.camera]): - if fingerprint[CAN.camera].get(0x3d6) != 8 or fingerprint[CAN.camera].get(0x186) != 8: - carlog.error('dashcamOnly: SecOC is unsupported') - ret.dashcamOnly = True + ret.safetyConfigs[-1].safetyParam |= FordSafetyFlags.FLAG_FORD_CANFD.value else: # Lock out if the car does not have needed lateral and longitudinal control APIs. # Note that we also check CAN for adaptive cruise, but no known signal for LCA exists pscm_config = next((fw for fw in car_fw if fw.ecu == Ecu.eps and b'\x22\xDE\x01' in fw.request), None) if pscm_config: if len(pscm_config.fwVersion) != 24: - carlog.error('dashcamOnly: Invalid EPS FW version') ret.dashcamOnly = True else: config_tja = pscm_config.fwVersion[7] # Traffic Jam Assist config_lca = pscm_config.fwVersion[8] # Lane Centering Assist if config_tja != 0xFF or config_lca != 0xFF: - carlog.error('dashcamOnly: Car lacks required lateral control APIs') ret.dashcamOnly = True # Auto Transmission: 0x732 ECU or Gear_Shift_by_Wire_FD1 diff --git a/opendbc/car/ford/values.py b/opendbc/car/ford/values.py index 57f41ca2a78..5a0667a191b 100644 --- a/opendbc/car/ford/values.py +++ b/opendbc/car/ford/values.py @@ -3,10 +3,10 @@ from dataclasses import dataclass, field, replace from enum import Enum, IntFlag -from opendbc.car import AngleSteeringLimits, Bus, CarSpecs, DbcDict, PlatformConfig, Platforms, uds +from opendbc.car import AngleRateLimit, Bus, CarSpecs, DbcDict, PlatformConfig, Platforms, uds from opendbc.car.structs import CarParams from opendbc.car.docs_definitions import CarFootnote, CarHarness, CarDocs, CarParts, Column, \ - Device + Device, SupportType from opendbc.car.fw_query_definitions import FwQueryConfig, LiveFwVersions, OfflineFwVersions, Request, StdQueries, p16 Ecu = CarParams.Ecu @@ -20,18 +20,16 @@ class CarControllerParams: ACC_UI_STEP = 20 # ACCDATA_3, 5Hz BUTTONS_STEP = 5 # Steering_Data_FD1, 10Hz, but send twice as fast + CURVATURE_MAX = 0.02 # Max curvature for steering command, m^-1 STEER_DRIVER_ALLOWANCE = 1.0 # Driver intervention threshold, Nm - ANGLE_LIMITS: AngleSteeringLimits = AngleSteeringLimits( - 0.02, # Max curvature for steering command, m^-1 - # Curvature rate limits - # Max curvature is limited by the EPS to an equivalent of ~2.0 m/s^2 at all speeds, - # however max curvature rate linearly decreases as speed increases: - # ~0.009 m^-1/sec at 7 m/s, ~0.002 m^-1/sec at 35 m/s - # Limit to ~2 m/s^3 up, ~3.3 m/s^3 down at 75 mph and match EPS limit at low speed - ([5, 25], [0.00045, 0.0001]), - ([5, 25], [0.00045, 0.00015]) - ) + # Curvature rate limits + # Max curvature is limited by the EPS to an equivalent of ~2.0 m/s^2 at all speeds, + # however max curvature rate linearly decreases as speed increases: + # ~0.009 m^-1/sec at 7 m/s, ~0.002 m^-1/sec at 35 m/s + # Limit to ~2 m/s^3 up, ~3.3 m/s^3 down at 75 mph and match EPS limit at low speed + ANGLE_RATE_LIMIT_UP = AngleRateLimit(speed_bp=[5, 25], angle_v=[0.00045, 0.0001]) + ANGLE_RATE_LIMIT_DOWN = AngleRateLimit(speed_bp=[5, 25], angle_v=[0.00045, 0.00015]) CURVATURE_ERROR = 0.002 # ~6 degrees at 10 m/s, ~10 degrees at 35 m/s ACCEL_MAX = 2.0 # m/s^2 max acceleration @@ -44,8 +42,8 @@ def __init__(self, CP): class FordSafetyFlags(IntFlag): - LONG_CONTROL = 1 - CANFD = 2 + FLAG_FORD_LONG_CONTROL = 1 + FLAG_FORD_CANFD = 2 class FordFlags(IntFlag): @@ -107,14 +105,6 @@ def init(self): super().init() self.flags |= FordFlags.CANFD -@dataclass -class FordF150LightningPlatform(FordCANFDPlatformConfig): - def init(self): - super().init() - - # Don't show in docs until this issue is resolved. See https://github.com/commaai/openpilot/issues/30302 - self.car_docs = [] - class CAR(Platforms): FORD_BRONCO_SPORT_MK1 = FordPlatformConfig( @@ -136,11 +126,11 @@ class CAR(Platforms): CarSpecs(mass=2050, wheelbase=3.025, steerRatio=16.8), ) FORD_F_150_MK14 = FordCANFDPlatformConfig( - [FordCarDocs("Ford F-150 2021-23", "Co-Pilot360 Assist 2.0", hybrid=True)], + [FordCarDocs("Ford F-150 2022-23", "Co-Pilot360 Assist 2.0", hybrid=True, support_type=SupportType.REVIEW)], CarSpecs(mass=2000, wheelbase=3.69, steerRatio=17.0), ) - FORD_F_150_LIGHTNING_MK1 = FordF150LightningPlatform( - [FordCarDocs("Ford F-150 Lightning 2022-23", "Co-Pilot360 Assist 2.0")], + FORD_F_150_LIGHTNING_MK1 = FordCANFDPlatformConfig( + [FordCarDocs("Ford F-150 Lightning 2022-23", "Co-Pilot360 Assist 2.0", support_type=SupportType.REVIEW)], CarSpecs(mass=2948, wheelbase=3.70, steerRatio=16.9), ) FORD_FOCUS_MK4 = FordPlatformConfig( @@ -155,11 +145,11 @@ class CAR(Platforms): CarSpecs(mass=1650, wheelbase=3.076, steerRatio=17.0), ) FORD_MUSTANG_MACH_E_MK1 = FordCANFDPlatformConfig( - [FordCarDocs("Ford Mustang Mach-E 2021-23", "All")], + [FordCarDocs("Ford Mustang Mach-E 2021-23", "All", support_type=SupportType.REVIEW)], CarSpecs(mass=2200, wheelbase=2.984, steerRatio=17.0), # TODO: check steer ratio ) FORD_RANGER_MK2 = FordCANFDPlatformConfig( - [FordCarDocs("Ford Ranger 2024", "Adaptive Cruise Control with Lane Centering")], + [FordCarDocs("Ford Ranger 2024", "Adaptive Cruise Control with Lane Centering", support_type=SupportType.REVIEW)], CarSpecs(mass=2000, wheelbase=3.27, steerRatio=17.0), ) diff --git a/opendbc/car/fw_versions.py b/opendbc/car/fw_versions.py index 09d83b52761..7ce1665ce86 100644 --- a/opendbc/car/fw_versions.py +++ b/opendbc/car/fw_versions.py @@ -238,7 +238,7 @@ def get_fw_versions_ordered(can_recv: CanRecvCallable, can_send: CanSendCallable # This allows brands with only one ECU to be queried first (e.g. Tesla) for brand in sorted(brand_matches, key=lambda b: (brand_matches[b].count(True), brand_matches[b].count(True) / len(brand_matches[b])), reverse=True): # Skip this brand if there are no matching present ECUs - if True not in brand_matches[brand]: + if not len(brand_matches[brand]): continue car_fw = get_fw_versions(can_recv, can_send, set_obd_multiplexing, query_brand=brand, timeout=timeout, num_pandas=num_pandas, progress=progress) diff --git a/opendbc/car/gm/carcontroller.py b/opendbc/car/gm/carcontroller.py index bbfd7056db0..c9faf3c4a97 100644 --- a/opendbc/car/gm/carcontroller.py +++ b/opendbc/car/gm/carcontroller.py @@ -20,7 +20,7 @@ class CarController(CarControllerBase): def __init__(self, dbc_names, CP): super().__init__(dbc_names, CP) self.start_time = 0. - self.apply_torque_last = 0 + self.apply_steer_last = 0 self.apply_gas = 0 self.apply_brake = 0 self.last_steer_frame = 0 @@ -70,15 +70,15 @@ def update(self, CC, CS, now_nanos): self.lka_steering_cmd_counter = CS.pt_lka_steering_cmd_counter + 1 if CC.latActive: - new_torque = int(round(actuators.torque * self.params.STEER_MAX)) - apply_torque = apply_driver_steer_torque_limits(new_torque, self.apply_torque_last, CS.out.steeringTorque, self.params) + new_steer = int(round(actuators.steer * self.params.STEER_MAX)) + apply_steer = apply_driver_steer_torque_limits(new_steer, self.apply_steer_last, CS.out.steeringTorque, self.params) else: - apply_torque = 0 + apply_steer = 0 self.last_steer_frame = self.frame - self.apply_torque_last = apply_torque + self.apply_steer_last = apply_steer idx = self.lka_steering_cmd_counter % 4 - can_sends.append(gmcan.create_steering_control(self.packer_pt, CanBus.POWERTRAIN, apply_torque, idx, CC.latActive)) + can_sends.append(gmcan.create_steering_control(self.packer_pt, CanBus.POWERTRAIN, apply_steer, idx, CC.latActive)) if self.CP.openpilotLongitudinalControl: # Gas/regen, brakes, and UI commands - all at 25Hz @@ -153,8 +153,8 @@ def update(self, CC, CS, now_nanos): can_sends.append(gmcan.create_pscm_status(self.packer_pt, CanBus.CAMERA, CS.pscm_status)) new_actuators = actuators.as_builder() - new_actuators.torque = self.apply_torque_last / self.params.STEER_MAX - new_actuators.torqueOutputCan = self.apply_torque_last + new_actuators.steer = self.apply_steer_last / self.params.STEER_MAX + new_actuators.steerOutputCan = self.apply_steer_last new_actuators.gas = self.apply_gas new_actuators.brake = self.apply_brake diff --git a/opendbc/car/gm/gmcan.py b/opendbc/car/gm/gmcan.py index c9d1effc2e0..6c583fe336d 100644 --- a/opendbc/car/gm/gmcan.py +++ b/opendbc/car/gm/gmcan.py @@ -36,12 +36,12 @@ def create_pscm_status(packer, bus, pscm_status): return packer.make_can_msg("PSCMStatus", bus, values) -def create_steering_control(packer, bus, apply_torque, idx, lkas_active): +def create_steering_control(packer, bus, apply_steer, idx, lkas_active): values = { "LKASteeringCmdActive": lkas_active, - "LKASteeringCmd": apply_torque, + "LKASteeringCmd": apply_steer, "RollingCounter": idx, - "LKASteeringCmdChecksum": 0x1000 - (lkas_active << 11) - (apply_torque & 0x7ff) - idx + "LKASteeringCmdChecksum": 0x1000 - (lkas_active << 11) - (apply_steer & 0x7ff) - idx } return packer.make_can_msg("ASCMLKASteeringCmd", bus, values) diff --git a/opendbc/car/gm/interface.py b/opendbc/car/gm/interface.py index ee42f3dec50..b1a55d81396 100755 --- a/opendbc/car/gm/interface.py +++ b/opendbc/car/gm/interface.py @@ -97,7 +97,7 @@ def _get_params(ret: structs.CarParams, candidate, fingerprint, car_fw, experime ret.networkLocation = NetworkLocation.fwdCamera ret.radarUnavailable = True # no radar ret.pcmCruise = True - ret.safetyConfigs[0].safetyParam |= GMSafetyFlags.HW_CAM.value + ret.safetyConfigs[0].safetyParam |= GMSafetyFlags.FLAG_GM_HW_CAM.value ret.minEnableSpeed = -1 if candidate in SDGM_CAR else 5 * CV.KPH_TO_MS ret.minSteerSpeed = 10 * CV.KPH_TO_MS @@ -110,7 +110,7 @@ def _get_params(ret: structs.CarParams, candidate, fingerprint, car_fw, experime if experimental_long: ret.pcmCruise = False ret.openpilotLongitudinalControl = True - ret.safetyConfigs[0].safetyParam |= GMSafetyFlags.HW_CAM_LONG.value + ret.safetyConfigs[0].safetyParam |= GMSafetyFlags.FLAG_GM_HW_CAM_LONG.value if candidate in ALT_ACCS: ret.experimentalLongitudinalAvailable = False diff --git a/opendbc/car/gm/values.py b/opendbc/car/gm/values.py index 8691ee9059b..cb9428b190c 100644 --- a/opendbc/car/gm/values.py +++ b/opendbc/car/gm/values.py @@ -61,8 +61,8 @@ def __init__(self, CP): class GMSafetyFlags(IntFlag): - HW_CAM = 1 - HW_CAM_LONG = 2 + FLAG_GM_HW_CAM = 1 + FLAG_GM_HW_CAM_LONG = 2 @dataclass diff --git a/opendbc/car/honda/carcontroller.py b/opendbc/car/honda/carcontroller.py index 16255d542e3..a31e457210f 100644 --- a/opendbc/car/honda/carcontroller.py +++ b/opendbc/car/honda/carcontroller.py @@ -114,7 +114,7 @@ def __init__(self, dbc_names, CP): self.speed = 0.0 self.gas = 0.0 self.brake = 0.0 - self.last_torque = 0.0 + self.last_steer = 0.0 def update(self, CC, CS, now_nanos): actuators = CC.actuators @@ -131,9 +131,9 @@ def update(self, CC, CS, now_nanos): gas, brake = 0.0, 0.0 # *** rate limit steer *** - limited_torque = rate_limit(actuators.torque, self.last_torque, -self.params.STEER_DELTA_DOWN * DT_CTRL, - self.params.STEER_DELTA_UP * DT_CTRL) - self.last_torque = limited_torque + limited_steer = rate_limit(actuators.steer, self.last_steer, -self.params.STEER_DELTA_DOWN * DT_CTRL, + self.params.STEER_DELTA_UP * DT_CTRL) + self.last_steer = limited_steer # *** apply brake hysteresis *** pre_limit_brake, self.braking, self.brake_steady = actuator_hysteresis(brake, self.braking, self.brake_steady, @@ -148,8 +148,8 @@ def update(self, CC, CS, now_nanos): # **** process the car messages **** # steer torque is converted back to CAN reference (positive when steering right) - apply_torque = int(np.interp(-limited_torque * self.params.STEER_MAX, - self.params.STEER_LOOKUP_BP, self.params.STEER_LOOKUP_V)) + apply_steer = int(np.interp(-limited_steer * self.params.STEER_MAX, + self.params.STEER_LOOKUP_BP, self.params.STEER_LOOKUP_V)) # Send CAN commands can_sends = [] @@ -160,7 +160,7 @@ def update(self, CC, CS, now_nanos): can_sends.append(make_tester_present_msg(0x18DAB0F1, 1, suppress_response=True)) # Send steering command. - can_sends.append(hondacan.create_steering_control(self.packer, self.CAN, apply_torque, CC.latActive)) + can_sends.append(hondacan.create_steering_control(self.packer, self.CAN, apply_steer, CC.latActive)) # wind brake from air resistance decel at high speed wind_brake = np.interp(CS.out.vEgo, [0.0, 2.3, 35.0], [0.001, 0.002, 0.15]) @@ -207,7 +207,7 @@ def update(self, CC, CS, now_nanos): if self.CP.carFingerprint in HONDA_BOSCH: self.accel = float(np.clip(accel, self.params.BOSCH_ACCEL_MIN, self.params.BOSCH_ACCEL_MAX)) - self.gas = float(np.interp(accel, self.params.BOSCH_GAS_LOOKUP_BP, self.params.BOSCH_GAS_LOOKUP_V)) + self.gas = float(np.interp(accel, self.params.BOSCH_GAS_IMPERIAL_LOOKUP_BP, self.params.BOSCH_GAS_IMPERIAL_LOOKUP_V)) if self.CP.carFingerprint = CAR.ACURA_RDX_3G_MMR else float(np.interp(accel, self.params.BOSCH_GAS_LOOKUP_BP, self.params.BOSCH_GAS_LOOKUP_V)) stopping = actuators.longControlState == LongCtrlState.stopping self.stopping_counter = self.stopping_counter + 1 if stopping else 0 @@ -241,8 +241,8 @@ def update(self, CC, CS, now_nanos): new_actuators.accel = self.accel new_actuators.gas = self.gas new_actuators.brake = self.brake - new_actuators.torque = self.last_torque - new_actuators.torqueOutputCan = apply_torque + new_actuators.steer = self.last_steer + new_actuators.steerOutputCan = apply_steer self.frame += 1 return new_actuators, can_sends diff --git a/opendbc/car/honda/carstate.py b/opendbc/car/honda/carstate.py index b70a9a394ba..b1755b23f85 100644 --- a/opendbc/car/honda/carstate.py +++ b/opendbc/car/honda/carstate.py @@ -8,7 +8,7 @@ from opendbc.car.honda.hondacan import CanBus, get_cruise_speed_conversion from opendbc.car.honda.values import CAR, DBC, STEER_THRESHOLD, HONDA_BOSCH, \ HONDA_NIDEC_ALT_SCM_MESSAGES, HONDA_BOSCH_RADARLESS, \ - HondaFlags, CruiseButtons, CruiseSettings, GearShifter + HondaFlags, CruiseButtons, CruiseSettings from opendbc.car.interfaces import CarStateBase TransmissionType = structs.CarParams.TransmissionType @@ -44,7 +44,7 @@ def get_can_messages(CP, gearbox_msg): ("SCM_BUTTONS", 25), ] - if CP.carFingerprint in (CAR.HONDA_CRV_HYBRID, CAR.HONDA_CIVIC_BOSCH_DIESEL, CAR.ACURA_RDX_3G, CAR.HONDA_E): + if CP.carFingerprint in (CAR.HONDA_CRV_HYBRID, CAR.HONDA_CIVIC_BOSCH_DIESEL, CAR.ACURA_RDX_3G, CAR.ACURA_RDX_3G_MMR, CAR.HONDA_E): messages.append((gearbox_msg, 50)) else: messages.append((gearbox_msg, 100)) @@ -70,7 +70,7 @@ def get_can_messages(CP, gearbox_msg): # TODO: clean this up if CP.carFingerprint in (CAR.HONDA_ACCORD, CAR.HONDA_CIVIC_BOSCH, CAR.HONDA_CIVIC_BOSCH_DIESEL, CAR.HONDA_CRV_HYBRID, CAR.HONDA_INSIGHT, - CAR.ACURA_RDX_3G, CAR.HONDA_E, CAR.HONDA_CIVIC_2022, CAR.HONDA_HRV_3G): + CAR.ACURA_RDX_3G, CAR.ACURA_RDX_3G_MMR, CAR.HONDA_E, CAR.HONDA_CIVIC_2022, CAR.HONDA_HRV_3G): pass elif CP.carFingerprint in (CAR.HONDA_ODYSSEY_CHN, CAR.HONDA_FREED, CAR.HONDA_HRV): pass @@ -92,15 +92,12 @@ def __init__(self, CP): self.gearbox_msg = "GEARBOX" if CP.carFingerprint == CAR.HONDA_ACCORD and CP.transmissionType == TransmissionType.cvt: self.gearbox_msg = "GEARBOX_15T" - elif CP.transmissionType == TransmissionType.manual: - self.gearbox_msg = "GEARBOX_ALT_2" self.main_on_sig_msg = "SCM_FEEDBACK" if CP.carFingerprint in HONDA_NIDEC_ALT_SCM_MESSAGES: self.main_on_sig_msg = "SCM_BUTTONS" - if CP.transmissionType != TransmissionType.manual: - self.shifter_values = can_define.dv[self.gearbox_msg]["GEAR_SHIFTER"] + self.shifter_values = can_define.dv[self.gearbox_msg]["GEAR_SHIFTER"] self.steer_status_values = defaultdict(lambda: "UNKNOWN", can_define.dv["STEER_STATUS"]["STEER_STATUS"]) self.brake_switch_prev = False @@ -139,7 +136,7 @@ def update(self, can_parsers) -> structs.CarState: ret.standstill = cp.vl["ENGINE_DATA"]["XMISSION_SPEED"] < 1e-5 # TODO: find a common signal across all cars if self.CP.carFingerprint in (CAR.HONDA_ACCORD, CAR.HONDA_CIVIC_BOSCH, CAR.HONDA_CIVIC_BOSCH_DIESEL, CAR.HONDA_CRV_HYBRID, CAR.HONDA_INSIGHT, - CAR.ACURA_RDX_3G, CAR.HONDA_E, CAR.HONDA_CIVIC_2022, CAR.HONDA_HRV_3G): + CAR.ACURA_RDX_3G, CAR.ACURA_RDX_3G_MMR, CAR.HONDA_E, CAR.HONDA_CIVIC_2022, CAR.HONDA_HRV_3G): ret.doorOpen = bool(cp.vl["SCM_FEEDBACK"]["DRIVERS_DOOR_OPEN"]) elif self.CP.carFingerprint in (CAR.HONDA_ODYSSEY_CHN, CAR.HONDA_FREED, CAR.HONDA_HRV): ret.doorOpen = bool(cp.vl["SCM_BUTTONS"]["DRIVERS_DOOR_OPEN"]) @@ -197,15 +194,8 @@ def update(self, can_parsers) -> structs.CarState: if self.CP.carFingerprint in (HONDA_BOSCH | {CAR.HONDA_CIVIC, CAR.HONDA_ODYSSEY, CAR.HONDA_ODYSSEY_CHN}): ret.parkingBrake = cp.vl["EPB_STATUS"]["EPB_STATE"] != 0 - if self.CP.transmissionType == TransmissionType.manual: - ret.clutchPressed = cp.vl["GEARBOX_ALT_2"]["GEAR_MT"] == 0 - if cp.vl["GEARBOX_ALT_2"]["GEAR_MT"] == 14: - ret.gearShifter = GearShifter.reverse - else: - ret.gearShifter = GearShifter.drive - else: - gear = int(cp.vl[self.gearbox_msg]["GEAR_SHIFTER"]) - ret.gearShifter = self.parse_gear_shifter(self.shifter_values.get(gear, None)) + gear = int(cp.vl[self.gearbox_msg]["GEAR_SHIFTER"]) + ret.gearShifter = self.parse_gear_shifter(self.shifter_values.get(gear, None)) ret.gas = cp.vl["POWERTRAIN_DATA"]["PEDAL_GAS"] ret.gasPressed = ret.gas > 1e-5 diff --git a/opendbc/car/honda/fingerprints.py b/opendbc/car/honda/fingerprints.py index 486f5005a4b..e2aa6cec31d 100644 --- a/opendbc/car/honda/fingerprints.py +++ b/opendbc/car/honda/fingerprints.py @@ -665,20 +665,16 @@ (Ecu.vsa, 0x18da28f1, None): [ b'57114-TJB-A030\x00\x00', b'57114-TJB-A040\x00\x00', - b'57114-TJB-A120\x00\x00', ], (Ecu.fwdRadar, 0x18dab0f1, None): [ b'36802-TJB-A040\x00\x00', b'36802-TJB-A050\x00\x00', - b'36802-TJB-A540\x00\x00', ], (Ecu.fwdCamera, 0x18dab5f1, None): [ b'36161-TJB-A040\x00\x00', - b'36161-TJB-A530\x00\x00', ], (Ecu.shiftByWire, 0x18da0bf1, None): [ b'54008-TJB-A520\x00\x00', - b'54008-TJB-A530\x00\x00', ], (Ecu.transmission, 0x18da1ef1, None): [ b'28102-5YK-A610\x00\x00', @@ -686,35 +682,59 @@ b'28102-5YK-A630\x00\x00', b'28102-5YK-A700\x00\x00', b'28102-5YK-A711\x00\x00', - b'28102-5YK-A800\x00\x00', b'28102-5YL-A620\x00\x00', b'28102-5YL-A700\x00\x00', b'28102-5YL-A711\x00\x00', ], (Ecu.srs, 0x18da53f1, None): [ b'77959-TJB-A040\x00\x00', - b'77959-TJB-A120\x00\x00', b'77959-TJB-A210\x00\x00', ], (Ecu.electricBrakeBooster, 0x18da2bf1, None): [ b'46114-TJB-A040\x00\x00', b'46114-TJB-A050\x00\x00', b'46114-TJB-A060\x00\x00', - b'46114-TJB-A120\x00\x00', ], (Ecu.gateway, 0x18daeff1, None): [ b'38897-TJB-A040\x00\x00', b'38897-TJB-A110\x00\x00', b'38897-TJB-A120\x00\x00', - b'38897-TJB-A220\x00\x00', ], (Ecu.eps, 0x18da30f1, None): [ b'39990-TJB-A030\x00\x00', b'39990-TJB-A040\x00\x00', - b'39990-TJB-A070\x00\x00', b'39990-TJB-A130\x00\x00', ], }, +CAR.ACURA_RDX_3G_MMR: { + (Ecu.vsa, 0x18da28f1, None): [ + b'57114-TJB-A120\x00\x00', + ], + (Ecu.fwdRadar, 0x18dab0f1, None): [ + b'36802-TJB-A540\x00\x00', + ], + (Ecu.fwdCamera, 0x18dab5f1, None): [ + b'36161-TJB-A530\x00\x00', + ], + (Ecu.shiftByWire, 0x18da0bf1, None): [ + b'54008-TJB-A530\x00\x00', + ], + (Ecu.transmission, 0x18da1ef1, None): [ + b'28102-5YK-A800\x00\x00', + ], + (Ecu.srs, 0x18da53f1, None): [ + b'77959-TJB-A120\x00\x00', + ], + (Ecu.electricBrakeBooster, 0x18da2bf1, None): [ + b'46114-TJB-A120\x00\x00', + ], + (Ecu.gateway, 0x18daeff1, None): [ + b'38897-TJB-A220\x00\x00', + ], + (Ecu.eps, 0x18da30f1, None): [ + b'39990-TJB-A070\x00\x00', + ], + }, CAR.HONDA_RIDGELINE: { (Ecu.eps, 0x18da30f1, None): [ b'39990-T6Z-A020\x00\x00', @@ -865,7 +885,6 @@ b'39990-T24-T120\x00\x00', b'39990-T39-A130\x00\x00', b'39990-T43-J020\x00\x00', - b'39990-T60-J030\x00\x00', ], (Ecu.gateway, 0x18daeff1, None): [ b'38897-T20-A020\x00\x00', @@ -874,7 +893,6 @@ b'38897-T20-A510\x00\x00', b'38897-T21-A010\x00\x00', b'38897-T24-Z120\x00\x00', - b'38897-T60-A110\x00\x00', ], (Ecu.srs, 0x18da53f1, None): [ b'77959-T20-A970\x00\x00', @@ -883,7 +901,6 @@ b'77959-T39-A910\x00\x00', b'77959-T47-A940\x00\x00', b'77959-T47-A950\x00\x00', - b'77959-T60-A920\x00\x00', ], (Ecu.fwdRadar, 0x18dab0f1, None): [ b'36161-T20-A060\x00\x00', @@ -894,13 +911,11 @@ b'36161-T47-A070\x00\x00', b'8S102-T20-AA10\x00\x00', b'8S102-T47-AA10\x00\x00', - b'8S102-T60-AA10\x00\x00', ], (Ecu.vsa, 0x18da28f1, None): [ b'57114-T20-AB40\x00\x00', b'57114-T24-TB30\x00\x00', b'57114-T43-JB30\x00\x00', - b'57114-T60-AA20\x00\x00', ], (Ecu.transmission, 0x18da1ef1, None): [ b'28101-65D-A020\x00\x00', diff --git a/opendbc/car/honda/hondacan.py b/opendbc/car/honda/hondacan.py index 878bdcb62bd..bc068338fc2 100644 --- a/opendbc/car/honda/hondacan.py +++ b/opendbc/car/honda/hondacan.py @@ -46,7 +46,7 @@ def body(self) -> int: def get_cruise_speed_conversion(car_fingerprint: str, is_metric: bool) -> float: # on certain cars, CRUISE_SPEED changes to imperial with car's unit setting - return CV.MPH_TO_MS if car_fingerprint in HONDA_BOSCH_RADARLESS and not is_metric else CV.KPH_TO_MS + return CV.MPH_TO_MS if car_fingerprint in ( HONDA_BOSCH_RADARLESS, CAR.ACURA_RDX_3G_MMR ) and not is_metric else CV.KPH_TO_MS def create_brake_command(packer, CAN, apply_brake, pump_on, pcm_override, pcm_cancel_cmd, fcw, car_fingerprint, stock_brake): @@ -117,9 +117,9 @@ def create_acc_commands(packer, CAN, enabled, active, accel, gas, stopping_count return commands -def create_steering_control(packer, CAN, apply_torque, lkas_active): +def create_steering_control(packer, CAN, apply_steer, lkas_active): values = { - "STEER_TORQUE": apply_torque if lkas_active else 0, + "STEER_TORQUE": apply_steer if lkas_active else 0, "STEER_TORQUE_REQUEST": lkas_active, } return packer.make_can_msg("STEERING_CONTROL", CAN.lkas, values) diff --git a/opendbc/car/honda/interface.py b/opendbc/car/honda/interface.py index 5d3830ee757..2f03d20b438 100755 --- a/opendbc/car/honda/interface.py +++ b/opendbc/car/honda/interface.py @@ -54,9 +54,6 @@ def _get_params(ret: structs.CarParams, candidate, fingerprint, car_fw, experime # Accord ICE 1.5T CVT has different gearbox message if candidate == CAR.HONDA_ACCORD and 0x191 in fingerprint[CAN.pt]: ret.transmissionType = TransmissionType.cvt - # New Civics can have manual transmission - elif candidate == CAR.HONDA_CIVIC_2022 and 0x191 not in fingerprint[CAN.pt]: - ret.transmissionType = TransmissionType.manual # Certain Hondas have an extra steering sensor at the bottom of the steering rack, # which improves controls quality as it removes the steering column torsion from feedback. @@ -156,6 +153,10 @@ def _get_params(ret: structs.CarParams, candidate, fingerprint, car_fw, experime ret.lateralParams.torqueBP, ret.lateralParams.torqueV = [[0, 3840], [0, 3840]] ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.2], [0.06]] + elif candidate == CAR.ACURA_RDX_3G_MMR: + ret.lateralParams.torqueBP, ret.lateralParams.torqueV = [[0, 3840], [0, 3840]] + ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.2], [0.06]] + elif candidate in (CAR.HONDA_ODYSSEY, CAR.HONDA_ODYSSEY_CHN): ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.28], [0.08]] if candidate == CAR.HONDA_ODYSSEY_CHN: @@ -188,17 +189,17 @@ def _get_params(ret: structs.CarParams, candidate, fingerprint, car_fw, experime ret.flags |= HondaFlags.BOSCH_ALT_BRAKE.value if ret.flags & HondaFlags.BOSCH_ALT_BRAKE: - ret.safetyConfigs[0].safetyParam |= HondaSafetyFlags.ALT_BRAKE.value + ret.safetyConfigs[0].safetyParam |= HondaSafetyFlags.FLAG_HONDA_ALT_BRAKE.value # These cars use alternate SCM messages (SCM_FEEDBACK AND SCM_BUTTON) if candidate in HONDA_NIDEC_ALT_SCM_MESSAGES: - ret.safetyConfigs[0].safetyParam |= HondaSafetyFlags.NIDEC_ALT.value + ret.safetyConfigs[0].safetyParam |= HondaSafetyFlags.FLAG_HONDA_NIDEC_ALT.value if ret.openpilotLongitudinalControl and candidate in HONDA_BOSCH: - ret.safetyConfigs[0].safetyParam |= HondaSafetyFlags.BOSCH_LONG.value + ret.safetyConfigs[0].safetyParam |= HondaSafetyFlags.FLAG_HONDA_BOSCH_LONG.value if candidate in HONDA_BOSCH_RADARLESS: - ret.safetyConfigs[0].safetyParam |= HondaSafetyFlags.RADARLESS.value + ret.safetyConfigs[0].safetyParam |= HondaSafetyFlags.FLAG_HONDA_RADARLESS.value # min speed to enable ACC. if car can do stop and go, then set enabling speed # to a negative value, so it won't matter. Otherwise, add 0.5 mph margin to not diff --git a/opendbc/car/honda/values.py b/opendbc/car/honda/values.py index 9233f750671..1d0ffcdff1a 100644 --- a/opendbc/car/honda/values.py +++ b/opendbc/car/honda/values.py @@ -8,7 +8,7 @@ Ecu = structs.CarParams.Ecu VisualAlert = structs.CarControl.HUDControl.VisualAlert -GearShifter = structs.CarState.GearShifter + class CarControllerParams: # Allow small margin below -3.5 m/s^2 from ISO 15622:2018 since we @@ -34,6 +34,9 @@ class CarControllerParams: BOSCH_GAS_LOOKUP_BP = [-0.2, 2.0] # 2m/s^2 BOSCH_GAS_LOOKUP_V = [0, 1600] + BOSCH_GAS_IMPERIAL_LOOKUP_BP = [-0.2, 2.0] # 2m/s^2 + BOSCH_GAS_IMPERIAL_LOOKUP_V = [0, 1999] # regressions found higher numbers fit curve better, ACC crashes over 2000 so set to 1999 for stability + STEER_STEP = 1 # 100 Hz STEER_DELTA_UP = 3 # min/max in 0.33s for all Honda STEER_DELTA_DOWN = 3 @@ -48,10 +51,11 @@ def __init__(self, CP): class HondaSafetyFlags(IntFlag): - ALT_BRAKE = 1 - BOSCH_LONG = 2 - NIDEC_ALT = 4 - RADARLESS = 8 + FLAG_HONDA_ALT_BRAKE = 1 + FLAG_HONDA_BOSCH_LONG = 2 + FLAG_HONDA_NIDEC_ALT = 4 + FLAG_HONDA_RADARLESS = 8 + class HondaFlags(IntFlag): @@ -63,12 +67,11 @@ class HondaFlags(IntFlag): # Static flags BOSCH = 4 BOSCH_RADARLESS = 8 - + NIDEC = 16 NIDEC_ALT_PCM_ACCEL = 32 NIDEC_ALT_SCM_MESSAGES = 64 - # Car button codes class CruiseButtons: RES_ACCEL = 4 @@ -186,6 +189,12 @@ class CAR(Platforms): {Bus.pt: 'acura_rdx_2020_can_generated'}, flags=HondaFlags.BOSCH_ALT_BRAKE, ) + ACURA_RDX_3G_MMR = HondaBoschPlatformConfig( + [HondaCarDocs("Acura RDX 2022-24", "All", min_steer_speed=70. * CV.KPH_TO_MS)], + CarSpecs(mass=4079 * CV.LB_TO_KG, wheelbase=2.75, steerRatio=12.0, centerToFrontRatio=0.41, tireStiffnessFactor=0.677), # as spec + {Bus.pt: 'acura_rdx_2020_can_generated'}, + flags=HondaFlags.BOSCH_ALT_BRAKE + ) HONDA_INSIGHT = HondaBoschPlatformConfig( [HondaCarDocs("Honda Insight 2019-22", "All", min_steer_speed=3. * CV.MPH_TO_MS)], CarSpecs(mass=2987 * CV.LB_TO_KG, wheelbase=2.7, steerRatio=15.0, centerToFrontRatio=0.39, tireStiffnessFactor=0.82), # as spec @@ -314,8 +323,8 @@ class CAR(Platforms): # Note that we still attempt to match with them when they are present # This is or'd with (ALL_ECUS - ESSENTIAL_ECUS) from fw_versions.py non_essential_ecus={ - Ecu.eps: [CAR.ACURA_RDX_3G, CAR.HONDA_ACCORD, CAR.HONDA_CIVIC_2022, CAR.HONDA_E, CAR.HONDA_HRV_3G], - Ecu.vsa: [CAR.ACURA_RDX_3G, CAR.HONDA_ACCORD, CAR.HONDA_CIVIC, CAR.HONDA_CIVIC_BOSCH, CAR.HONDA_CIVIC_2022, CAR.HONDA_CRV_5G, CAR.HONDA_CRV_HYBRID, + Ecu.eps: [CAR.ACURA_RDX_3G, CAR.ACURA_RDX_3G_MMR, CAR.HONDA_ACCORD, CAR.HONDA_CIVIC_2022, CAR.HONDA_E, CAR.HONDA_HRV_3G], + Ecu.vsa: [CAR.ACURA_RDX_3G, CAR.ACURA_RDX_3G_MMR, CAR.HONDA_ACCORD, CAR.HONDA_CIVIC, CAR.HONDA_CIVIC_BOSCH, CAR.HONDA_CIVIC_2022, CAR.HONDA_CRV_5G, CAR.HONDA_CRV_HYBRID, CAR.HONDA_E, CAR.HONDA_HRV_3G, CAR.HONDA_INSIGHT], }, extra_ecus=[ diff --git a/opendbc/car/hyundai/carcontroller.py b/opendbc/car/hyundai/carcontroller.py index 162f234cc4a..4c345c7d806 100644 --- a/opendbc/car/hyundai/carcontroller.py +++ b/opendbc/car/hyundai/carcontroller.py @@ -51,7 +51,7 @@ def __init__(self, dbc_names, CP): self.angle_limit_counter = 0 self.accel_last = 0 - self.apply_torque_last = 0 + self.apply_steer_last = 0 self.car_fingerprint = CP.carFingerprint self.last_button_frame = 0 @@ -60,8 +60,8 @@ def update(self, CC, CS, now_nanos): hud_control = CC.hudControl # steering torque - new_torque = int(round(actuators.torque * self.params.STEER_MAX)) - apply_torque = apply_driver_steer_torque_limits(new_torque, self.apply_torque_last, CS.out.steeringTorque, self.params) + new_steer = int(round(actuators.steer * self.params.STEER_MAX)) + apply_steer = apply_driver_steer_torque_limits(new_steer, self.apply_steer_last, CS.out.steeringTorque, self.params) # >90 degree steering fault prevention self.angle_limit_counter, apply_steer_req = common_fault_avoidance(abs(CS.out.steeringAngleDeg) >= MAX_ANGLE, CC.latActive, @@ -69,12 +69,12 @@ def update(self, CC, CS, now_nanos): MAX_ANGLE_CONSECUTIVE_FRAMES) if not CC.latActive: - apply_torque = 0 + apply_steer = 0 # Hold torque with induced temporary fault when cutting the actuation bit torque_fault = CC.latActive and not apply_steer_req - self.apply_torque_last = apply_torque + self.apply_steer_last = apply_steer # accel + longitudinal accel = float(np.clip(actuators.accel, CarControllerParams.ACCEL_MIN, CarControllerParams.ACCEL_MAX)) @@ -92,8 +92,8 @@ def update(self, CC, CS, now_nanos): # tester present - w/ no response (keeps relevant ECU disabled) if self.frame % 100 == 0 and not (self.CP.flags & HyundaiFlags.CANFD_CAMERA_SCC) and self.CP.openpilotLongitudinalControl: # for longitudinal control, either radar or ADAS driving ECU - addr, bus = 0x7d0, self.CAN.ECAN if self.CP.flags & HyundaiFlags.CANFD else 0 - if self.CP.flags & HyundaiFlags.CANFD_LKA_STEERING.value: + addr, bus = 0x7d0, 0 + if self.CP.flags & HyundaiFlags.CANFD_HDA2.value: addr, bus = 0x730, self.CAN.ECAN can_sends.append(make_tester_present_msg(addr, bus, suppress_response=True)) @@ -103,30 +103,28 @@ def update(self, CC, CS, now_nanos): # CAN-FD platforms if self.CP.flags & HyundaiFlags.CANFD: - lka_steering = self.CP.flags & HyundaiFlags.CANFD_LKA_STEERING - lka_steering_long = lka_steering and self.CP.openpilotLongitudinalControl + hda2 = self.CP.flags & HyundaiFlags.CANFD_HDA2 + hda2_long = hda2 and self.CP.openpilotLongitudinalControl # steering control - can_sends.extend(hyundaicanfd.create_steering_messages(self.packer, self.CP, self.CAN, CC.enabled, apply_steer_req, apply_torque)) + can_sends.extend(hyundaicanfd.create_steering_messages(self.packer, self.CP, self.CAN, CC.enabled, apply_steer_req, apply_steer)) - # prevent LFA from activating on LKA steering cars by sending "no lane lines detected" to ADAS ECU - if self.frame % 5 == 0 and lka_steering: - can_sends.append(hyundaicanfd.create_suppress_lfa(self.packer, self.CAN, CS.lfa_block_msg, - self.CP.flags & HyundaiFlags.CANFD_LKA_STEERING_ALT)) + # prevent LFA from activating on HDA2 by sending "no lane lines detected" to ADAS ECU + if self.frame % 5 == 0 and hda2: + can_sends.append(hyundaicanfd.create_suppress_lfa(self.packer, self.CAN, CS.hda2_lfa_block_msg, + self.CP.flags & HyundaiFlags.CANFD_HDA2_ALT_STEERING)) # LFA and HDA icons - if self.frame % 5 == 0 and (not lka_steering or lka_steering_long): + if self.frame % 5 == 0 and (not hda2 or hda2_long): can_sends.append(hyundaicanfd.create_lfahda_cluster(self.packer, self.CAN, CC.enabled)) # blinkers - if lka_steering and self.CP.flags & HyundaiFlags.ENABLE_BLINKERS: + if hda2 and self.CP.flags & HyundaiFlags.ENABLE_BLINKERS: can_sends.extend(hyundaicanfd.create_spas_messages(self.packer, self.CAN, self.frame, CC.leftBlinker, CC.rightBlinker)) if self.CP.openpilotLongitudinalControl: - if lka_steering: + if hda2: can_sends.extend(hyundaicanfd.create_adrv_messages(self.packer, self.CAN, self.frame)) - else: - can_sends.extend(hyundaicanfd.create_fca_warning_light(self.packer, self.CAN, self.frame)) if self.frame % 2 == 0: can_sends.append(hyundaicanfd.create_acc_control(self.packer, self.CAN, CC.enabled, self.accel_last, accel, stopping, CC.cruiseControl.override, set_speed_in_units, hud_control)) @@ -135,7 +133,7 @@ def update(self, CC, CS, now_nanos): # button presses can_sends.extend(self.create_button_messages(CC, CS, use_clu11=False)) else: - can_sends.append(hyundaican.create_lkas11(self.packer, self.frame, self.CP, apply_torque, apply_steer_req, + can_sends.append(hyundaican.create_lkas11(self.packer, self.frame, self.CP, apply_steer, apply_steer_req, torque_fault, CS.lkas11, sys_warning, sys_state, CC.enabled, hud_control.leftLaneVisible, hud_control.rightLaneVisible, left_lane_warning, right_lane_warning)) @@ -164,8 +162,8 @@ def update(self, CC, CS, now_nanos): can_sends.append(hyundaican.create_frt_radar_opt(self.packer)) new_actuators = actuators.as_builder() - new_actuators.torque = apply_torque / self.params.STEER_MAX - new_actuators.torqueOutputCan = apply_torque + new_actuators.steer = apply_steer / self.params.STEER_MAX + new_actuators.steerOutputCan = apply_steer new_actuators.accel = accel self.frame += 1 @@ -192,7 +190,7 @@ def create_button_messages(self, CC: structs.CarControl, CS: CarState, use_clu11 self.last_button_frame = self.frame else: for _ in range(20): - can_sends.append(hyundaicanfd.create_buttons(self.packer, self.CP, self.CAN, CS.buttons_counter + 1, Buttons.CANCEL)) + can_sends.append(hyundaicanfd.create_buttons(self.packer, self.CP, self.CAN, CS.buttons_counter+1, Buttons.CANCEL)) self.last_button_frame = self.frame # cruise standstill resume @@ -202,7 +200,7 @@ def create_button_messages(self, CC: structs.CarControl, CS: CarState, use_clu11 pass else: for _ in range(20): - can_sends.append(hyundaicanfd.create_buttons(self.packer, self.CP, self.CAN, CS.buttons_counter + 1, Buttons.RES_ACCEL)) + can_sends.append(hyundaicanfd.create_buttons(self.packer, self.CP, self.CAN, CS.buttons_counter+1, Buttons.RES_ACCEL)) self.last_button_frame = self.frame return can_sends diff --git a/opendbc/car/hyundai/carstate.py b/opendbc/car/hyundai/carstate.py index cb58d3d5c24..83f6e1e9a2c 100644 --- a/opendbc/car/hyundai/carstate.py +++ b/opendbc/car/hyundai/carstate.py @@ -27,7 +27,6 @@ def __init__(self, CP): self.cruise_buttons: deque = deque([Buttons.NONE] * PREV_BUTTON_SAMPLES, maxlen=PREV_BUTTON_SAMPLES) self.main_buttons: deque = deque([Buttons.NONE] * PREV_BUTTON_SAMPLES, maxlen=PREV_BUTTON_SAMPLES) - self.lda_button = 0 self.gear_msg_canfd = "ACCELERATOR" if CP.flags & HyundaiFlags.EV else \ "GEAR_ALT" if CP.flags & HyundaiFlags.CANFD_ALT_GEARS else \ @@ -41,8 +40,6 @@ def __init__(self, CP): self.shifter_values = can_define.dv["CLU15"]["CF_Clu_Gear"] elif self.CP.flags & HyundaiFlags.TCU_GEARS: self.shifter_values = can_define.dv["TCU12"]["CUR_GR"] - elif CP.flags & HyundaiFlags.FCEV: - self.shifter_values = can_define.dv["EMS20"]["HYDROGEN_GEAR_SHIFTER"] else: self.shifter_values = can_define.dv["LVR12"]["CF_Lvr_Gear"] @@ -135,10 +132,8 @@ def update(self, can_parsers) -> structs.CarState: ret.espActive = cp.vl["TCS11"]["ABS_ACT"] == 1 ret.accFaulted = cp.vl["TCS13"]["ACCEnable"] != 0 # 0 ACC CONTROL ENABLED, 1-3 ACC CONTROL DISABLED - if self.CP.flags & (HyundaiFlags.HYBRID | HyundaiFlags.EV | HyundaiFlags.FCEV): - if self.CP.flags & HyundaiFlags.FCEV: - ret.gas = cp.vl["FCEV_ACCELERATOR"]["ACCELERATOR_PEDAL"] / 254. - elif self.CP.flags & HyundaiFlags.HYBRID: + if self.CP.flags & (HyundaiFlags.HYBRID | HyundaiFlags.EV): + if self.CP.flags & HyundaiFlags.HYBRID: ret.gas = cp.vl["E_EMS11"]["CR_Vcu_AccPedDep_Pos"] / 254. else: ret.gas = cp.vl["E_EMS11"]["Accel_Pedal_Pos"] / 254. @@ -151,8 +146,6 @@ def update(self, can_parsers) -> structs.CarState: # as this seems to be standard over all cars, but is not the preferred method. if self.CP.flags & (HyundaiFlags.HYBRID | HyundaiFlags.EV): gear = cp.vl["ELECT_GEAR"]["Elect_Gear_Shifter"] - elif self.CP.flags & HyundaiFlags.FCEV: - gear = cp.vl["EMS20"]["HYDROGEN_GEAR_SHIFTER"] elif self.CP.flags & HyundaiFlags.CLUSTER_GEARS: gear = cp.vl["CLU15"]["CF_Clu_Gear"] elif self.CP.flags & HyundaiFlags.TCU_GEARS: @@ -181,15 +174,11 @@ def update(self, can_parsers) -> structs.CarState: self.steer_state = cp.vl["MDPS12"]["CF_Mdps_ToiActive"] # 0 NOT ACTIVE, 1 ACTIVE prev_cruise_buttons = self.cruise_buttons[-1] prev_main_buttons = self.main_buttons[-1] - prev_lda_button = self.lda_button self.cruise_buttons.extend(cp.vl_all["CLU11"]["CF_Clu_CruiseSwState"]) self.main_buttons.extend(cp.vl_all["CLU11"]["CF_Clu_CruiseSwMain"]) - if self.CP.flags & HyundaiFlags.HAS_LDA_BUTTON: - self.lda_button = cp.vl["BCM_PO_11"]["LDA_BTN"] ret.buttonEvents = [*create_button_events(self.cruise_buttons[-1], prev_cruise_buttons, BUTTONS_DICT), - *create_button_events(self.main_buttons[-1], prev_main_buttons, {1: ButtonType.mainCruise}), - *create_button_events(self.lda_button, prev_lda_button, {1: ButtonType.lkas})] + *create_button_events(self.main_buttons[-1], prev_main_buttons, {1: ButtonType.mainCruise})] return ret @@ -219,18 +208,17 @@ def update_canfd(self, can_parsers) -> structs.CarState: # TODO: figure out positions ret.wheelSpeeds = self.get_wheel_speeds( - cp.vl["WHEEL_SPEEDS"]["WHL_SpdFLVal"], - cp.vl["WHEEL_SPEEDS"]["WHL_SpdFRVal"], - cp.vl["WHEEL_SPEEDS"]["WHL_SpdRLVal"], - cp.vl["WHEEL_SPEEDS"]["WHL_SpdRRVal"], + cp.vl["WHEEL_SPEEDS"]["WHEEL_SPEED_1"], + cp.vl["WHEEL_SPEEDS"]["WHEEL_SPEED_2"], + cp.vl["WHEEL_SPEEDS"]["WHEEL_SPEED_3"], + cp.vl["WHEEL_SPEEDS"]["WHEEL_SPEED_4"], ) ret.vEgoRaw = (ret.wheelSpeeds.fl + ret.wheelSpeeds.fr + ret.wheelSpeeds.rl + ret.wheelSpeeds.rr) / 4. ret.vEgo, ret.aEgo = self.update_speed_kf(ret.vEgoRaw) - ret.standstill = ret.wheelSpeeds.fl <= STANDSTILL_THRESHOLD and ret.wheelSpeeds.fr <= STANDSTILL_THRESHOLD and \ - ret.wheelSpeeds.rl <= STANDSTILL_THRESHOLD and ret.wheelSpeeds.rr <= STANDSTILL_THRESHOLD + ret.standstill = ret.wheelSpeeds.fl <= STANDSTILL_THRESHOLD and ret.wheelSpeeds.rr <= STANDSTILL_THRESHOLD ret.steeringRateDeg = cp.vl["STEERING_SENSORS"]["STEERING_RATE"] - ret.steeringAngleDeg = cp.vl["STEERING_SENSORS"]["STEERING_ANGLE"] + ret.steeringAngleDeg = cp.vl["STEERING_SENSORS"]["STEERING_ANGLE"] * -1 ret.steeringTorque = cp.vl["MDPS"]["STEERING_COL_TORQUE"] ret.steeringTorqueEps = cp.vl["MDPS"]["STEERING_OUT_TORQUE"] ret.steeringPressed = self.update_steering_pressed(abs(ret.steeringTorque) > self.params.STEER_THRESHOLD, 5) @@ -269,20 +257,17 @@ def update_canfd(self, can_parsers) -> structs.CarState: prev_cruise_buttons = self.cruise_buttons[-1] prev_main_buttons = self.main_buttons[-1] - prev_lda_button = self.lda_button self.cruise_buttons.extend(cp.vl_all[self.cruise_btns_msg_canfd]["CRUISE_BUTTONS"]) self.main_buttons.extend(cp.vl_all[self.cruise_btns_msg_canfd]["ADAPTIVE_CRUISE_MAIN_BTN"]) - self.lda_button = cp.vl[self.cruise_btns_msg_canfd]["LDA_BTN"] self.buttons_counter = cp.vl[self.cruise_btns_msg_canfd]["COUNTER"] ret.accFaulted = cp.vl["TCS"]["ACCEnable"] != 0 # 0 ACC CONTROL ENABLED, 1-3 ACC CONTROL DISABLED - if self.CP.flags & HyundaiFlags.CANFD_LKA_STEERING: - self.lfa_block_msg = copy.copy(cp_cam.vl["CAM_0x362"] if self.CP.flags & HyundaiFlags.CANFD_LKA_STEERING_ALT + if self.CP.flags & HyundaiFlags.CANFD_HDA2: + self.hda2_lfa_block_msg = copy.copy(cp_cam.vl["CAM_0x362"] if self.CP.flags & HyundaiFlags.CANFD_HDA2_ALT_STEERING else cp_cam.vl["CAM_0x2a4"]) ret.buttonEvents = [*create_button_events(self.cruise_buttons[-1], prev_cruise_buttons, BUTTONS_DICT), - *create_button_events(self.main_buttons[-1], prev_main_buttons, {1: ButtonType.mainCruise}), - *create_button_events(self.lda_button, prev_lda_button, {1: ButtonType.lkas})] + *create_button_events(self.main_buttons[-1], prev_main_buttons, {1: ButtonType.mainCruise})] return ret @@ -324,8 +309,8 @@ def get_can_parsers_canfd(self, CP): ] cam_messages = [] - if CP.flags & HyundaiFlags.CANFD_LKA_STEERING: - block_lfa_msg = "CAM_0x362" if CP.flags & HyundaiFlags.CANFD_LKA_STEERING_ALT else "CAM_0x2a4" + if CP.flags & HyundaiFlags.CANFD_HDA2: + block_lfa_msg = "CAM_0x362" if CP.flags & HyundaiFlags.CANFD_HDA2_ALT_STEERING else "CAM_0x2a4" cam_messages += [(block_lfa_msg, 20)] elif CP.flags & HyundaiFlags.CANFD_CAMERA_SCC: cam_messages += [ @@ -370,8 +355,6 @@ def get_can_parsers(self, CP): if CP.flags & (HyundaiFlags.HYBRID | HyundaiFlags.EV): pt_messages.append(("E_EMS11", 50)) - elif CP.flags & HyundaiFlags.FCEV: - pt_messages.append(("FCEV_ACCELERATOR", 100)) else: pt_messages += [ ("EMS12", 100), @@ -380,8 +363,6 @@ def get_can_parsers(self, CP): if CP.flags & (HyundaiFlags.HYBRID | HyundaiFlags.EV): pt_messages.append(("ELECT_GEAR", 20)) - elif CP.flags & HyundaiFlags.FCEV: - pt_messages.append(("EMS20", 100)) elif CP.flags & HyundaiFlags.CLUSTER_GEARS: pass elif CP.flags & HyundaiFlags.TCU_GEARS: @@ -389,9 +370,6 @@ def get_can_parsers(self, CP): else: pt_messages.append(("LVR12", 100)) - if CP.flags & HyundaiFlags.HAS_LDA_BUTTON: - pt_messages.append(("BCM_PO_11", 50)) - cam_messages = [ ("LKAS11", 100) ] diff --git a/opendbc/car/hyundai/fingerprints.py b/opendbc/car/hyundai/fingerprints.py index 9d7c7831462..f6c30ec8316 100644 --- a/opendbc/car/hyundai/fingerprints.py +++ b/opendbc/car/hyundai/fingerprints.py @@ -141,7 +141,6 @@ (Ecu.fwdRadar, 0x7d0, None): [ b'\xf1\x00AEhe SCC F-CUP 1.00 1.00 99110-G2600 ', b'\xf1\x00AEhe SCC FHCUP 1.00 1.00 99110-G2600 ', - b'\xf1\x00AEhe SCC FHCUP 1.00 1.02 99110-G2100 ', ], (Ecu.eps, 0x7d4, None): [ b'\xf1\x00AE MDPS C 1.00 1.01 56310/G2510 4APHC101', @@ -149,7 +148,6 @@ ], (Ecu.fwdCamera, 0x7c4, None): [ b'\xf1\x00AEH MFC AT USA LHD 1.00 1.00 95740-G2700 201027', - b'\xf1\x00AEH MFC AT USA LHD 1.00 1.01 95740-G2600 190819', ], }, CAR.HYUNDAI_SONATA: { @@ -1011,7 +1009,6 @@ b'\xf1\x00NE1 MFC AT EUR LHD 1.00 1.06 99211-GI000 210813', b'\xf1\x00NE1 MFC AT EUR LHD 1.00 1.06 99211-GI010 230110', b'\xf1\x00NE1 MFC AT EUR RHD 1.00 1.01 99211-GI010 211007', - b'\xf1\x00NE1 MFC AT EUR RHD 1.00 1.01 99211-GI100 240110', b'\xf1\x00NE1 MFC AT EUR RHD 1.00 1.02 99211-GI010 211206', b'\xf1\x00NE1 MFC AT IND RHD 1.00 1.07 99211-GI010 230620', b'\xf1\x00NE1 MFC AT KOR LHD 1.00 1.00 99211-GI020 230719', @@ -1091,7 +1088,6 @@ }, CAR.GENESIS_GV70_1ST_GEN: { (Ecu.fwdCamera, 0x7c4, None): [ - b'\xf1\x00JK1 MFC AT CAN LHD 1.00 1.02 99211-IY000 230627', b'\xf1\x00JK1 MFC AT USA LHD 1.00 1.01 99211-AR200 220125', b'\xf1\x00JK1 MFC AT USA LHD 1.00 1.01 99211-AR300 220125', b'\xf1\x00JK1 MFC AT USA LHD 1.00 1.04 99211-AR000 210204', @@ -1099,7 +1095,6 @@ (Ecu.fwdRadar, 0x7d0, None): [ b'\xf1\x00JK1_ SCC FHCUP 1.00 1.00 99110-AR200 ', b'\xf1\x00JK1_ SCC FHCUP 1.00 1.00 99110-AR300 ', - b'\xf1\x00JK1_ SCC FHCUP 1.00 1.00 99110-IY000 ', b'\xf1\x00JK1_ SCC FHCUP 1.00 1.02 99110-AR000 ', ], }, @@ -1107,7 +1102,6 @@ (Ecu.fwdCamera, 0x7c4, None): [ b'\xf1\x00JK1EMFC AT AUS RHD 1.00 1.01 99211-DS100 220125', b'\xf1\x00JK1EMFC AT USA LHD 1.00 1.00 99211-IT100 220919', - b'\xf1\x00JK1EMFC AT USA LHD 1.00 1.01 99211-IT100 230628', ], (Ecu.fwdRadar, 0x7d0, None): [ b'\xf1\x00JKev SCC ----- 1.00 1.01 99110-DS000 ', @@ -1204,33 +1198,4 @@ b'\xf1\x00US4_ RDR ----- 1.00 1.00 99110-CG000 ', ], }, - CAR.HYUNDAI_NEXO_1ST_GEN: { - (Ecu.abs, 0x7d1, None): [ - b'\xf1\x00FE IEB \x01 312 \x11\x13 58520-M5000', - ], - (Ecu.fwdCamera, 0x7c4, None): [ - b'\xf1\x00FE MFC AT KOR LHD 1.00 1.00 99211-M5100 201218', - ], - (Ecu.eps, 0x7d4, None): [ - b'\xf1\x00FE MDPS C 1.00 1.05 56340-M5000 9903', - ], - (Ecu.fwdRadar, 0x7d0, None): [ - b'\xf1\x00FE__ SCC FHCUP 1.00 1.05 99110-M5000 ', - ], - }, - CAR.HYUNDAI_KONA_2022: { - (Ecu.fwdCamera, 0x7c4, None): [ - b'\xf1\x00OSP LKA AT USA LHD 1.00 1.04 99211-J9200 904', - ], - (Ecu.eps, 0x7d4, None): [ - b'\xf1\x00OSP MDPS C 1.00 1.04 56310/J9291 4OPCC104', - ], - (Ecu.fwdRadar, 0x7d0, None): [ - b'\xf1\x00YB__ FCA ----- 1.00 1.01 99110-J9000 \x00\x00\x00', - ], - (Ecu.transmission, 0x7e1, None): [ - b'\xf1\x00T01G00BL T01I00A1 DOS2T16X2XI00NS0\x8c`\xff\xe7', - b'\xf1\x00T01G00BL T01I00A1 DOS2T16X4XI00NS0\x99L\xeeq', - ], - }, } diff --git a/opendbc/car/hyundai/hyundaican.py b/opendbc/car/hyundai/hyundaican.py index d69c28d5c65..00bf2dbabf0 100644 --- a/opendbc/car/hyundai/hyundaican.py +++ b/opendbc/car/hyundai/hyundaican.py @@ -3,7 +3,7 @@ hyundai_checksum = crcmod.mkCrcFun(0x11D, initCrc=0xFD, rev=False, xorOut=0xdf) -def create_lkas11(packer, frame, CP, apply_torque, steer_req, +def create_lkas11(packer, frame, CP, apply_steer, steer_req, torque_fault, lkas11, sys_warning, sys_state, enabled, left_lane, right_lane, left_lane_depart, right_lane_depart): @@ -28,7 +28,7 @@ def create_lkas11(packer, frame, CP, apply_torque, steer_req, values["CF_Lkas_SysWarning"] = 3 if sys_warning else 0 values["CF_Lkas_LdwsLHWarning"] = left_lane_depart values["CF_Lkas_LdwsRHWarning"] = right_lane_depart - values["CR_Lkas_StrToqReq"] = apply_torque + values["CR_Lkas_StrToqReq"] = apply_steer values["CF_Lkas_ActToi"] = steer_req values["CF_Lkas_ToiFlt"] = torque_fault # seems to allow actuation on CR_Lkas_StrToqReq values["CF_Lkas_MsgCount"] = frame % 0x10 @@ -38,7 +38,7 @@ def create_lkas11(packer, frame, CP, apply_torque, steer_req, CAR.HYUNDAI_ELANTRA_HEV_2021, CAR.HYUNDAI_SONATA_HYBRID, CAR.HYUNDAI_KONA_EV, CAR.HYUNDAI_KONA_HEV, CAR.HYUNDAI_KONA_EV_2022, CAR.HYUNDAI_SANTA_FE_2022, CAR.KIA_K5_2021, CAR.HYUNDAI_IONIQ_HEV_2022, CAR.HYUNDAI_SANTA_FE_HEV_2022, CAR.HYUNDAI_SANTA_FE_PHEV_2022, CAR.KIA_STINGER_2022, CAR.KIA_K5_HEV_2020, CAR.KIA_CEED, - CAR.HYUNDAI_AZERA_6TH_GEN, CAR.HYUNDAI_AZERA_HEV_6TH_GEN, CAR.HYUNDAI_CUSTIN_1ST_GEN, CAR.HYUNDAI_KONA_2022): + CAR.HYUNDAI_AZERA_6TH_GEN, CAR.HYUNDAI_AZERA_HEV_6TH_GEN, CAR.HYUNDAI_CUSTIN_1ST_GEN): values["CF_Lkas_LdwsActivemode"] = int(left_lane) + (int(right_lane) << 1) values["CF_Lkas_LdwsOpt_USM"] = 2 diff --git a/opendbc/car/hyundai/hyundaicanfd.py b/opendbc/car/hyundai/hyundaicanfd.py index eb0e38f723e..8b18338b3f2 100644 --- a/opendbc/car/hyundai/hyundaicanfd.py +++ b/opendbc/car/hyundai/hyundaicanfd.py @@ -1,21 +1,20 @@ -import copy import numpy as np from opendbc.car import CanBusBase from opendbc.car.hyundai.values import HyundaiFlags class CanBus(CanBusBase): - def __init__(self, CP, fingerprint=None, lka_steering=None) -> None: + def __init__(self, CP, fingerprint=None, hda2=None) -> None: super().__init__(CP, fingerprint) - if lka_steering is None: - lka_steering = CP.flags & HyundaiFlags.CANFD_LKA_STEERING.value if CP is not None else False + if hda2 is None: + hda2 = CP.flags & HyundaiFlags.CANFD_HDA2.value if CP is not None else False - # On the CAN-FD platforms, the LKAS camera is on both A-CAN and E-CAN. LKA steering cars - # have a different harness than the LFA steering variants in order to split + # On the CAN-FD platforms, the LKAS camera is on both A-CAN and E-CAN. HDA2 cars + # have a different harness than the HDA1 and non-HDA variants in order to split # a different bus, since the steering is done by different ECUs. self._a, self._e = 1, 0 - if lka_steering: + if hda2: self._a, self._e = 0, 1 self._a += self.offset @@ -35,41 +34,38 @@ def CAM(self): return self._cam -def create_steering_messages(packer, CP, CAN, enabled, lat_active, apply_torque): - common_values = { +def create_steering_messages(packer, CP, CAN, enabled, lat_active, apply_steer): + + ret = [] + + values = { "LKA_MODE": 2, "LKA_ICON": 2 if enabled else 1, - "TORQUE_REQUEST": apply_torque, + "TORQUE_REQUEST": apply_steer, "LKA_ASSIST": 0, "STEER_REQ": 1 if lat_active else 0, "STEER_MODE": 0, "HAS_LANE_SAFETY": 0, # hide LKAS settings + "NEW_SIGNAL_1": 0, "NEW_SIGNAL_2": 0, } - lkas_values = copy.copy(common_values) - lkas_values["LKA_AVAILABLE"] = 0 - - lfa_values = copy.copy(common_values) - lfa_values["NEW_SIGNAL_1"] = 0 - - ret = [] - if CP.flags & HyundaiFlags.CANFD_LKA_STEERING: - lkas_msg = "LKAS_ALT" if CP.flags & HyundaiFlags.CANFD_LKA_STEERING_ALT else "LKAS" + if CP.flags & HyundaiFlags.CANFD_HDA2: + hda2_lkas_msg = "LKAS_ALT" if CP.flags & HyundaiFlags.CANFD_HDA2_ALT_STEERING else "LKAS" if CP.openpilotLongitudinalControl: - ret.append(packer.make_can_msg("LFA", CAN.ECAN, lfa_values)) - ret.append(packer.make_can_msg(lkas_msg, CAN.ACAN, lkas_values)) + ret.append(packer.make_can_msg("LFA", CAN.ECAN, values)) + ret.append(packer.make_can_msg(hda2_lkas_msg, CAN.ACAN, values)) else: - ret.append(packer.make_can_msg("LFA", CAN.ECAN, lfa_values)) + ret.append(packer.make_can_msg("LFA", CAN.ECAN, values)) return ret -def create_suppress_lfa(packer, CAN, lfa_block_msg, lka_steering_alt): - suppress_msg = "CAM_0x362" if lka_steering_alt else "CAM_0x2a4" - msg_bytes = 32 if lka_steering_alt else 24 +def create_suppress_lfa(packer, CAN, hda2_lfa_block_msg, hda2_alt_steering): + suppress_msg = "CAM_0x362" if hda2_alt_steering else "CAM_0x2a4" + msg_bytes = 32 if hda2_alt_steering else 24 - values = {f"BYTE{i}": lfa_block_msg[f"BYTE{i}"] for i in range(3, msg_bytes) if i != 7} - values["COUNTER"] = lfa_block_msg["COUNTER"] + values = {f"BYTE{i}": hda2_lfa_block_msg[f"BYTE{i}"] for i in range(3, msg_bytes) if i != 7} + values["COUNTER"] = hda2_lfa_block_msg["COUNTER"] values["SET_ME_0"] = 0 values["SET_ME_0_2"] = 0 values["LEFT_LANE_LINE"] = 0 @@ -83,7 +79,7 @@ def create_buttons(packer, CP, CAN, cnt, btn): "CRUISE_BUTTONS": btn, } - bus = CAN.ECAN if CP.flags & HyundaiFlags.CANFD_LKA_STEERING else CAN.CAM + bus = CAN.ECAN if CP.flags & HyundaiFlags.CANFD_HDA2 else CAN.CAM return packer.make_can_msg("CRUISE_BUTTONS", bus, values) def create_acc_cancel(packer, CP, CAN, cruise_info_copy): @@ -175,9 +171,16 @@ def create_spas_messages(packer, CAN, frame, left_blink, right_blink): return ret -def create_fca_warning_light(packer, CAN, frame): +def create_adrv_messages(packer, CAN, frame): + # messages needed to car happy after disabling + # the ADAS Driving ECU to do longitudinal control + ret = [] + values = { + } + ret.append(packer.make_can_msg("ADRV_0x51", CAN.ACAN, values)) + if frame % 2 == 0: values = { 'AEB_SETTING': 0x1, # show AEB disabled icon @@ -187,20 +190,6 @@ def create_fca_warning_light(packer, CAN, frame): 'SET_ME_9': 0x9, } ret.append(packer.make_can_msg("ADRV_0x160", CAN.ECAN, values)) - return ret - - -def create_adrv_messages(packer, CAN, frame): - # messages needed to car happy after disabling - # the ADAS Driving ECU to do longitudinal control - - ret = [] - - values = { - } - ret.append(packer.make_can_msg("ADRV_0x51", CAN.ACAN, values)) - - ret.extend(create_fca_warning_light(packer, CAN, frame)) if frame % 5 == 0: values = { diff --git a/opendbc/car/hyundai/interface.py b/opendbc/car/hyundai/interface.py index 5d5731968c3..a94aeb9ac40 100644 --- a/opendbc/car/hyundai/interface.py +++ b/opendbc/car/hyundai/interface.py @@ -1,6 +1,6 @@ from opendbc.car import Bus, get_safety_config, structs from opendbc.car.hyundai.hyundaicanfd import CanBus -from opendbc.car.hyundai.values import HyundaiFlags, CAR, DBC, \ +from opendbc.car.hyundai.values import HyundaiFlags, CAR, DBC, CANFD_RADAR_SCC_CAR, \ CANFD_UNSUPPORTED_LONGITUDINAL_CAR, \ UNSUPPORTED_LONGITUDINAL_CAR, HyundaiSafetyFlags from opendbc.car.hyundai.radar_interface import RADAR_START_ADDR @@ -20,34 +20,30 @@ def _get_params(ret: structs.CarParams, candidate, fingerprint, car_fw, experime ret.brand = "hyundai" cam_can = CanBus(None, fingerprint).CAM - lka_steering = 0x50 in fingerprint[cam_can] or 0x110 in fingerprint[cam_can] - CAN = CanBus(None, fingerprint, lka_steering) + hda2 = 0x50 in fingerprint[cam_can] or 0x110 in fingerprint[cam_can] + CAN = CanBus(None, fingerprint, hda2) if ret.flags & HyundaiFlags.CANFD: # Shared configuration for CAN-FD cars - ret.experimentalLongitudinalAvailable = candidate not in CANFD_UNSUPPORTED_LONGITUDINAL_CAR - if lka_steering and Ecu.adas not in [fw.ecu for fw in car_fw]: - # this needs to be figured out for cars without an ADAS ECU - ret.experimentalLongitudinalAvailable = False - + ret.experimentalLongitudinalAvailable = candidate not in (CANFD_UNSUPPORTED_LONGITUDINAL_CAR | CANFD_RADAR_SCC_CAR) ret.enableBsm = 0x1e5 in fingerprint[CAN.ECAN] if 0x105 in fingerprint[CAN.ECAN]: ret.flags |= HyundaiFlags.HYBRID.value - if lka_steering: - # detect LKA steering - ret.flags |= HyundaiFlags.CANFD_LKA_STEERING.value + # detect HDA2 with ADAS Driving ECU + if hda2: + ret.flags |= HyundaiFlags.CANFD_HDA2.value if 0x110 in fingerprint[CAN.CAM]: - ret.flags |= HyundaiFlags.CANFD_LKA_STEERING_ALT.value + ret.flags |= HyundaiFlags.CANFD_HDA2_ALT_STEERING.value else: - # no LKA steering + # non-HDA2 if 0x1cf not in fingerprint[CAN.ECAN]: ret.flags |= HyundaiFlags.CANFD_ALT_BUTTONS.value if not ret.flags & HyundaiFlags.RADAR_SCC: ret.flags |= HyundaiFlags.CANFD_CAMERA_SCC.value - # Some LKA steering cars have alternative messages for gear checks + # Some HDA2 cars have alternative messages for gear checks # ICE cars do not have 0x130; GEARS message on 0x40 or 0x70 instead if 0x130 not in fingerprint[CAN.ECAN]: if 0x40 not in fingerprint[CAN.ECAN]: @@ -60,14 +56,14 @@ def _get_params(ret: structs.CarParams, candidate, fingerprint, car_fw, experime cfgs.insert(0, get_safety_config(structs.CarParams.SafetyModel.noOutput)) ret.safetyConfigs = cfgs - if ret.flags & HyundaiFlags.CANFD_LKA_STEERING: - ret.safetyConfigs[-1].safetyParam |= HyundaiSafetyFlags.CANFD_LKA_STEERING.value - if ret.flags & HyundaiFlags.CANFD_LKA_STEERING_ALT: - ret.safetyConfigs[-1].safetyParam |= HyundaiSafetyFlags.CANFD_LKA_STEERING_ALT.value + if ret.flags & HyundaiFlags.CANFD_HDA2: + ret.safetyConfigs[-1].safetyParam |= HyundaiSafetyFlags.FLAG_HYUNDAI_CANFD_HDA2.value + if ret.flags & HyundaiFlags.CANFD_HDA2_ALT_STEERING: + ret.safetyConfigs[-1].safetyParam |= HyundaiSafetyFlags.FLAG_HYUNDAI_CANFD_HDA2_ALT_STEERING.value if ret.flags & HyundaiFlags.CANFD_ALT_BUTTONS: - ret.safetyConfigs[-1].safetyParam |= HyundaiSafetyFlags.CANFD_ALT_BUTTONS.value + ret.safetyConfigs[-1].safetyParam |= HyundaiSafetyFlags.FLAG_HYUNDAI_CANFD_ALT_BUTTONS.value if ret.flags & HyundaiFlags.CANFD_CAMERA_SCC: - ret.safetyConfigs[-1].safetyParam |= HyundaiSafetyFlags.CAMERA_SCC.value + ret.safetyConfigs[-1].safetyParam |= HyundaiSafetyFlags.FLAG_HYUNDAI_CAMERA_SCC.value else: # Shared configuration for non CAN-FD cars @@ -89,11 +85,7 @@ def _get_params(ret: structs.CarParams, candidate, fingerprint, car_fw, experime ret.safetyConfigs = [get_safety_config(structs.CarParams.SafetyModel.hyundai, 0)] if ret.flags & HyundaiFlags.CAMERA_SCC: - ret.safetyConfigs[0].safetyParam |= HyundaiSafetyFlags.CAMERA_SCC.value - - # These cars have the LFA button on the steering wheel - if 0x391 in fingerprint[0]: - ret.flags |= HyundaiFlags.HAS_LDA_BUTTON.value + ret.safetyConfigs[0].safetyParam |= HyundaiSafetyFlags.FLAG_HYUNDAI_CAMERA_SCC.value # Common lateral control setup @@ -103,13 +95,7 @@ def _get_params(ret: structs.CarParams, candidate, fingerprint, car_fw, experime CarInterfaceBase.configure_torque_tune(candidate, ret.lateralTuning) if ret.flags & HyundaiFlags.ALT_LIMITS: - ret.safetyConfigs[-1].safetyParam |= HyundaiSafetyFlags.ALT_LIMITS.value - - if ret.flags & HyundaiFlags.ALT_LIMITS_2: - ret.safetyConfigs[-1].safetyParam |= HyundaiSafetyFlags.ALT_LIMITS_2.value - - # see https://github.com/commaai/opendbc/pull/1137/ - ret.dashcamOnly = True + ret.safetyConfigs[-1].safetyParam |= HyundaiSafetyFlags.FLAG_HYUNDAI_ALT_LIMITS.value # Common longitudinal control setup @@ -122,13 +108,11 @@ def _get_params(ret: structs.CarParams, candidate, fingerprint, car_fw, experime ret.longitudinalActuatorDelay = 0.5 if ret.openpilotLongitudinalControl: - ret.safetyConfigs[-1].safetyParam |= HyundaiSafetyFlags.LONG.value + ret.safetyConfigs[-1].safetyParam |= HyundaiSafetyFlags.FLAG_HYUNDAI_LONG.value if ret.flags & HyundaiFlags.HYBRID: - ret.safetyConfigs[-1].safetyParam |= HyundaiSafetyFlags.HYBRID_GAS.value + ret.safetyConfigs[-1].safetyParam |= HyundaiSafetyFlags.FLAG_HYUNDAI_HYBRID_GAS.value elif ret.flags & HyundaiFlags.EV: - ret.safetyConfigs[-1].safetyParam |= HyundaiSafetyFlags.EV_GAS.value - elif ret.flags & HyundaiFlags.FCEV: - ret.safetyConfigs[-1].safetyParam |= HyundaiSafetyFlags.FCEV_GAS.value + ret.safetyConfigs[-1].safetyParam |= HyundaiSafetyFlags.FLAG_HYUNDAI_EV_GAS.value # Car specific configuration overrides @@ -144,8 +128,8 @@ def _get_params(ret: structs.CarParams, candidate, fingerprint, car_fw, experime @staticmethod def init(CP, can_recv, can_send): if CP.openpilotLongitudinalControl and not (CP.flags & (HyundaiFlags.CANFD_CAMERA_SCC | HyundaiFlags.CAMERA_SCC)): - addr, bus = 0x7d0, CanBus(CP).ECAN if CP.flags & HyundaiFlags.CANFD else 0 - if CP.flags & HyundaiFlags.CANFD_LKA_STEERING.value: + addr, bus = 0x7d0, 0 + if CP.flags & HyundaiFlags.CANFD_HDA2.value: addr, bus = 0x730, CanBus(CP).ECAN disable_ecu(can_recv, can_send, bus=bus, addr=addr, com_cont_req=b'\x28\x83\x01') diff --git a/opendbc/car/hyundai/tests/test_hyundai.py b/opendbc/car/hyundai/tests/test_hyundai.py index 6aedc73d95e..5e58a47adfd 100644 --- a/opendbc/car/hyundai/tests/test_hyundai.py +++ b/opendbc/car/hyundai/tests/test_hyundai.py @@ -37,7 +37,6 @@ CAR.HYUNDAI_KONA_HEV, CAR.HYUNDAI_SONATA_LF, CAR.HYUNDAI_VELOSTER, - CAR.HYUNDAI_KONA_2022, } CANFD_EXPECTED_ECUS = {Ecu.fwdCamera, Ecu.fwdRadar} @@ -45,14 +44,14 @@ class TestHyundaiFingerprint: def test_feature_detection(self): - # LKA steering - for lka_steering in (True, False): + # HDA2 + for hda2 in (True, False): fingerprint = gen_empty_fingerprint() - if lka_steering: + if hda2: cam_can = CanBus(None, fingerprint).CAM - fingerprint[cam_can] = [0x50, 0x110] # LKA steering messages + fingerprint[cam_can] = [0x50, 0x110] # HDA2 steering messages CP = CarInterface.get_params(CAR.KIA_EV6, fingerprint, [], False, False) - assert bool(CP.flags & HyundaiFlags.CANFD_LKA_STEERING) == lka_steering + assert bool(CP.flags & HyundaiFlags.CANFD_HDA2) == hda2 # radar available for radar in (True, False): @@ -67,7 +66,7 @@ def test_alternate_limits(self): fingerprint = gen_empty_fingerprint() for car_model in CAR: CP = CarInterface.get_params(car_model, fingerprint, [], False, False) - assert bool(CP.flags & HyundaiFlags.ALT_LIMITS) == bool(CP.safetyConfigs[-1].safetyParam & HyundaiSafetyFlags.ALT_LIMITS) + assert bool(CP.flags & HyundaiFlags.ALT_LIMITS) == bool(CP.safetyConfigs[-1].safetyParam & HyundaiSafetyFlags.FLAG_HYUNDAI_ALT_LIMITS) def test_can_features(self): # Test no EV/HEV in any gear lists (should all use ELECT_GEAR) diff --git a/opendbc/car/hyundai/values.py b/opendbc/car/hyundai/values.py index 8772fb4aa49..a99b815c377 100644 --- a/opendbc/car/hyundai/values.py +++ b/opendbc/car/hyundai/values.py @@ -45,37 +45,25 @@ def __init__(self, CP): self.STEER_DELTA_UP = 2 self.STEER_DELTA_DOWN = 3 - elif CP.flags & HyundaiFlags.ALT_LIMITS_2: - self.STEER_MAX = 170 - self.STEER_DELTA_UP = 2 - self.STEER_DELTA_DOWN = 3 - # Default for most HKG else: self.STEER_MAX = 384 class HyundaiSafetyFlags(IntFlag): - EV_GAS = 1 - HYBRID_GAS = 2 - LONG = 4 - CAMERA_SCC = 8 - CANFD_LKA_STEERING = 16 - CANFD_ALT_BUTTONS = 32 - ALT_LIMITS = 64 - CANFD_LKA_STEERING_ALT = 128 - FCEV_GAS = 256 - ALT_LIMITS_2 = 512 + FLAG_HYUNDAI_EV_GAS = 1 + FLAG_HYUNDAI_HYBRID_GAS = 2 + FLAG_HYUNDAI_LONG = 4 + FLAG_HYUNDAI_CAMERA_SCC = 8 + FLAG_HYUNDAI_CANFD_HDA2 = 16 + FLAG_HYUNDAI_CANFD_ALT_BUTTONS = 32 + FLAG_HYUNDAI_ALT_LIMITS = 64 + FLAG_HYUNDAI_CANFD_HDA2_ALT_STEERING = 128 class HyundaiFlags(IntFlag): # Dynamic Flags - - # Default assumption: all cars use LFA (ADAS) steering from the camera. - # CANFD_LKA_STEERING/CANFD_LKA_STEERING_ALT cars typically have both LKA (camera) and LFA (ADAS) steering messages, - # with LKA commands forwarded to the ADAS DRV ECU. - # Most HDA2 trims are assumed to be equipped with the ADAS DRV ECU, though some variants may not be equipped with one. - CANFD_LKA_STEERING = 1 + CANFD_HDA2 = 1 CANFD_ALT_BUTTONS = 2 CANFD_ALT_GEARS = 2 ** 2 CANFD_CAMERA_SCC = 2 ** 3 @@ -85,7 +73,7 @@ class HyundaiFlags(IntFlag): CANFD_ALT_GEARS_2 = 2 ** 6 SEND_LFA = 2 ** 7 USE_FCA = 2 ** 8 - CANFD_LKA_STEERING_ALT = 2 ** 9 + CANFD_HDA2_ALT_STEERING = 2 ** 9 # these cars use a different gas signal HYBRID = 2 ** 10 @@ -120,18 +108,12 @@ class HyundaiFlags(IntFlag): MIN_STEER_32_MPH = 2 ** 23 - HAS_LDA_BUTTON = 2 ** 24 - - FCEV = 2 ** 25 - - ALT_LIMITS_2 = 2 ** 26 - class Footnote(Enum): CANFD = CarFootnote( "Requires a CAN FD panda kit if not using " + "comma 3X for this CAN FD car.", - Column.MODEL) + Column.MODEL, shop_footnote=False) @dataclass @@ -157,7 +139,7 @@ def init(self): @dataclass class HyundaiCanFDPlatformConfig(PlatformConfig): - dbc_dict: DbcDict = field(default_factory=lambda: {Bus.pt: "hyundai_canfd_generated"}) + dbc_dict: DbcDict = field(default_factory=lambda: {Bus.pt: "hyundai_canfd"}) def init(self): self.flags |= HyundaiFlags.CANFD @@ -221,7 +203,7 @@ class CAR(Platforms): flags=HyundaiFlags.HYBRID | HyundaiFlags.MIN_STEER_32_MPH, ) HYUNDAI_IONIQ_HEV_2022 = HyundaiPlatformConfig( - [HyundaiCarDocs("Hyundai Ioniq Hybrid 2020-22", car_parts=CarParts.common([CarHarness.hyundai_h]))], + [HyundaiCarDocs("Hyundai Ioniq Hybrid 2020-22", car_parts=CarParts.common([CarHarness.hyundai_h]))], # TODO: confirm 2020-21 harness, CarSpecs(mass=1490, wheelbase=2.7, steerRatio=13.73, tireStiffnessFactor=0.385), flags=HyundaiFlags.HYBRID | HyundaiFlags.LEGACY, ) @@ -250,11 +232,6 @@ class CAR(Platforms): CarSpecs(mass=1275, wheelbase=2.6, steerRatio=13.42, tireStiffnessFactor=0.385), flags=HyundaiFlags.CLUSTER_GEARS | HyundaiFlags.ALT_LIMITS, ) - HYUNDAI_KONA_2022 = HyundaiPlatformConfig( - [HyundaiCarDocs("Hyundai Kona 2022", car_parts=CarParts.common([CarHarness.hyundai_o]))], - CarSpecs(mass=1491, wheelbase=2.6, steerRatio=13.42, tireStiffnessFactor=0.385), - flags=HyundaiFlags.CAMERA_SCC, - ) HYUNDAI_KONA_EV = HyundaiPlatformConfig( [HyundaiCarDocs("Hyundai Kona Electric 2018-21", car_parts=CarParts.common([CarHarness.hyundai_g]))], CarSpecs(mass=1685, wheelbase=2.6, steerRatio=13.42, tireStiffnessFactor=0.385), @@ -276,11 +253,6 @@ class CAR(Platforms): CarSpecs(mass=1425, wheelbase=2.6, steerRatio=13.42, tireStiffnessFactor=0.385), flags=HyundaiFlags.HYBRID | HyundaiFlags.ALT_LIMITS, ) - HYUNDAI_NEXO_1ST_GEN = HyundaiPlatformConfig( - [HyundaiCarDocs("Hyundai Nexo 2021", "All", car_parts=CarParts.common([CarHarness.hyundai_h]))], - CarSpecs(mass=3990 * CV.LB_TO_KG, wheelbase=2.79, steerRatio=14.19), # https://www.hyundainews.com/assets/documents/original/42768-2021NEXOProductGuideSpecs.pdf - flags=HyundaiFlags.FCEV, - ) HYUNDAI_SANTA_FE = HyundaiPlatformConfig( [HyundaiCarDocs("Hyundai Santa Fe 2019-20", "All", video_link="https://youtu.be/bjDR0YjM__s", car_parts=CarParts.common([CarHarness.hyundai_d]))], @@ -562,7 +534,7 @@ class CAR(Platforms): GENESIS_GV70_1ST_GEN = HyundaiCanFDPlatformConfig( [ # TODO: Hyundai P is likely the correct harness for HDA II for 2.5T (unsupported due to missing ADAS ECU, is that the radar?) - HyundaiCarDocs("Genesis GV70 (2.5T Trim, without HDA II) 2022-24", "All", car_parts=CarParts.common([CarHarness.hyundai_l])), + HyundaiCarDocs("Genesis GV70 (2.5T Trim, without HDA II) 2022-23", "All", car_parts=CarParts.common([CarHarness.hyundai_l])), HyundaiCarDocs("Genesis GV70 (3.5T Trim, without HDA II) 2022-23", "All", car_parts=CarParts.common([CarHarness.hyundai_m])), ], CarSpecs(mass=1950, wheelbase=2.87, steerRatio=14.6), @@ -571,7 +543,7 @@ class CAR(Platforms): GENESIS_GV70_ELECTRIFIED_1ST_GEN = HyundaiCanFDPlatformConfig( [ HyundaiCarDocs("Genesis GV70 Electrified (Australia Only) 2022", "All", car_parts=CarParts.common([CarHarness.hyundai_q])), - HyundaiCarDocs("Genesis GV70 Electrified (with HDA II) 2023-24", "Highway Driving Assist II", car_parts=CarParts.common([CarHarness.hyundai_q])), + HyundaiCarDocs("Genesis GV70 Electrified (with HDA II) 2023", "Highway Driving Assist II", car_parts=CarParts.common([CarHarness.hyundai_q])), ], CarSpecs(mass=2260, wheelbase=2.87, steerRatio=17.1), flags=HyundaiFlags.EV, @@ -729,7 +701,7 @@ def match_fw_to_car_fuzzy(live_fw_versions, vin, offline_fw_versions) -> set[str ), # CAN & CAN FD query to understand the three digit date code - # LKA steering cars usually use 6 digit date codes, so skip bus 1 + # HDA2 cars usually use 6 digit date codes, so skip bus 1 Request( [HYUNDAI_ECU_MANUFACTURING_DATE], [HYUNDAI_VERSION_RESPONSE], @@ -763,7 +735,7 @@ def match_fw_to_car_fuzzy(live_fw_versions, vin, offline_fw_versions) -> set[str CAR.KIA_CEED, CAR.KIA_SELTOS], }, extra_ecus=[ - (Ecu.adas, 0x730, None), # ADAS Driving ECU on platforms with LKA steering + (Ecu.adas, 0x730, None), # ADAS Driving ECU on HDA2 platforms (Ecu.parkingAdas, 0x7b1, None), # ADAS Parking ECU (may exist on all platforms) (Ecu.hvac, 0x7b3, None), # HVAC Control Assembly (Ecu.cornerRadar, 0x7b7, None), diff --git a/opendbc/car/interfaces.py b/opendbc/car/interfaces.py index f2f71f1603f..edb689dc105 100644 --- a/opendbc/car/interfaces.py +++ b/opendbc/car/interfaces.py @@ -321,8 +321,8 @@ def update_blinker_from_lamp(self, blinker_time: int, left_blinker_lamp: bool, r def update_steering_pressed(self, steering_pressed, steering_pressed_min_count): """Applies filtering on steering pressed for noisy driver torque signals.""" - self.steering_pressed_cnt = self.steering_pressed_cnt + 1 if steering_pressed else 0 - self.steering_pressed_cnt = min(self.steering_pressed_cnt, steering_pressed_min_count + 1) + self.steering_pressed_cnt += 1 if steering_pressed else -1 + self.steering_pressed_cnt = float(np.clip(self.steering_pressed_cnt, 0, steering_pressed_min_count * 2)) return self.steering_pressed_cnt > steering_pressed_min_count def update_blinker_from_stalk(self, blinker_time: int, left_blinker_stalk: bool, right_blinker_stalk: bool): diff --git a/opendbc/car/isotp.py b/opendbc/car/isotp.py deleted file mode 100644 index ac64c413be0..00000000000 --- a/opendbc/car/isotp.py +++ /dev/null @@ -1,140 +0,0 @@ -import binascii -import time - -DEBUG = False - -def msg(x): - if DEBUG: - print("S:", binascii.hexlify(x)) - assert len(x) <= 7 - ret = bytes([len(x)]) + x - return ret.ljust(8, b"\x00") - -kmsgs = [] -def recv(panda, cnt, addr, nbus): - global kmsgs - ret = [] - - while len(ret) < cnt: - kmsgs += panda.can_recv() - nmsgs = [] - for ids, dat, bus in kmsgs: - if ids == addr and bus == nbus and len(ret) < cnt: - ret.append(dat) - else: - # leave around - nmsgs.append((ids, dat, bus)) - kmsgs = nmsgs[-256:] - return ret - -def isotp_recv_subaddr(panda, addr, bus, sendaddr, subaddr): - msg = recv(panda, 1, addr, bus)[0] - - # TODO: handle other subaddr also communicating - assert msg[0] == subaddr - - if msg[1] & 0xf0 == 0x10: - # first - tlen = ((msg[1] & 0xf) << 8) | msg[2] - dat = msg[3:] - - # 0 block size? - CONTINUE = bytes([subaddr]) + b"\x30" + b"\x00" * 6 - panda.can_send(sendaddr, CONTINUE, bus) - - idx = 1 - for mm in recv(panda, (tlen - len(dat) + 5) // 6, addr, bus): - assert mm[0] == subaddr - assert mm[1] == (0x20 | (idx & 0xF)) - dat += mm[2:] - idx += 1 - elif msg[1] & 0xf0 == 0x00: - # single - tlen = msg[1] & 0xf - dat = msg[2:] - else: - print(binascii.hexlify(msg)) - raise AssertionError - - return dat[0:tlen] - -# **** import below this line **** - -def isotp_send(panda, x, addr, bus=0, recvaddr=None, subaddr=None, rate=None): - if recvaddr is None: - recvaddr = addr + 8 - - if len(x) <= 7 and subaddr is None: - panda.can_send(addr, msg(x), bus) - elif len(x) <= 6 and subaddr is not None: - panda.can_send(addr, bytes([subaddr]) + msg(x)[0:7], bus) - else: - if subaddr: - ss = bytes([subaddr, 0x10 + (len(x) >> 8), len(x) & 0xFF]) + x[0:5] - x = x[5:] - else: - ss = bytes([0x10 + (len(x) >> 8), len(x) & 0xFF]) + x[0:6] - x = x[6:] - idx = 1 - sends = [] - while len(x) > 0: - if subaddr: - sends.append((bytes([subaddr, 0x20 + (idx & 0xF)]) + x[0:6]).ljust(8, b"\x00")) - x = x[6:] - else: - sends.append((bytes([0x20 + (idx & 0xF)]) + x[0:7]).ljust(8, b"\x00")) - x = x[7:] - idx += 1 - - # actually send - panda.can_send(addr, ss, bus) - rr = recv(panda, 1, recvaddr, bus)[0] - if rr.find(b"\x30\x01") != -1: - for s in sends[:-1]: - panda.can_send(addr, s, 0) - rr = recv(panda, 1, recvaddr, bus)[0] - panda.can_send(addr, sends[-1], 0) - else: - if rate is None: - panda.can_send_many([(addr, s, bus) for s in sends]) - else: - for dat in sends: - panda.can_send(addr, dat, bus) - time.sleep(rate) - -def isotp_recv(panda, addr, bus=0, sendaddr=None, subaddr=None): - if sendaddr is None: - sendaddr = addr - 8 - - if subaddr is not None: - dat = isotp_recv_subaddr(panda, addr, bus, sendaddr, subaddr) - else: - msg = recv(panda, 1, addr, bus)[0] - - if msg[0] & 0xf0 == 0x10: - # first - tlen = ((msg[0] & 0xf) << 8) | msg[1] - dat = msg[2:] - - # 0 block size? - CONTINUE = b"\x30" + b"\x00" * 7 - - panda.can_send(sendaddr, CONTINUE, bus) - - idx = 1 - for mm in recv(panda, (tlen - len(dat) + 6) // 7, addr, bus): - assert mm[0] == (0x20 | (idx & 0xF)) - dat += mm[1:] - idx += 1 - elif msg[0] & 0xf0 == 0x00: - # single - tlen = msg[0] & 0xf - dat = msg[1:] - else: - raise AssertionError - dat = dat[0:tlen] - - if DEBUG: - print("R:", binascii.hexlify(dat)) - - return dat diff --git a/opendbc/car/mazda/carcontroller.py b/opendbc/car/mazda/carcontroller.py index effc2925b06..f2ea87060ea 100644 --- a/opendbc/car/mazda/carcontroller.py +++ b/opendbc/car/mazda/carcontroller.py @@ -10,20 +10,20 @@ class CarController(CarControllerBase): def __init__(self, dbc_names, CP): super().__init__(dbc_names, CP) - self.apply_torque_last = 0 + self.apply_steer_last = 0 self.packer = CANPacker(dbc_names[Bus.pt]) self.brake_counter = 0 def update(self, CC, CS, now_nanos): can_sends = [] - apply_torque = 0 + apply_steer = 0 if CC.latActive: # calculate steer and also set limits due to driver torque - new_torque = int(round(CC.actuators.torque * CarControllerParams.STEER_MAX)) - apply_torque = apply_driver_steer_torque_limits(new_torque, self.apply_torque_last, - CS.out.steeringTorque, CarControllerParams) + new_steer = int(round(CC.actuators.steer * CarControllerParams.STEER_MAX)) + apply_steer = apply_driver_steer_torque_limits(new_steer, self.apply_steer_last, + CS.out.steeringTorque, CarControllerParams) if CC.cruiseControl.cancel: # If brake is pressed, let us wait >70ms before trying to disable crz to avoid @@ -42,7 +42,7 @@ def update(self, CC, CS, now_nanos): # Send Resume button when planner wants car to move can_sends.append(mazdacan.create_button_cmd(self.packer, self.CP, CS.crz_btns_counter, Buttons.RESUME)) - self.apply_torque_last = apply_torque + self.apply_steer_last = apply_steer # send HUD alerts if self.frame % 50 == 0: @@ -54,11 +54,11 @@ def update(self, CC, CS, now_nanos): # send steering command can_sends.append(mazdacan.create_steering_control(self.packer, self.CP, - self.frame, apply_torque, CS.cam_lkas)) + self.frame, apply_steer, CS.cam_lkas)) new_actuators = CC.actuators.as_builder() - new_actuators.torque = apply_torque / CarControllerParams.STEER_MAX - new_actuators.torqueOutputCan = apply_torque + new_actuators.steer = apply_steer / CarControllerParams.STEER_MAX + new_actuators.steerOutputCan = apply_steer self.frame += 1 return new_actuators, can_sends diff --git a/opendbc/car/mazda/mazdacan.py b/opendbc/car/mazda/mazdacan.py index 441f76a4f1a..0605d980f83 100644 --- a/opendbc/car/mazda/mazdacan.py +++ b/opendbc/car/mazda/mazdacan.py @@ -1,9 +1,9 @@ from opendbc.car.mazda.values import Buttons, MazdaFlags -def create_steering_control(packer, CP, frame, apply_torque, lkas): +def create_steering_control(packer, CP, frame, apply_steer, lkas): - tmp = apply_torque + 2048 + tmp = apply_steer + 2048 lo = tmp & 0xFF hi = tmp >> 8 @@ -47,7 +47,7 @@ def create_steering_control(packer, CP, frame, apply_torque, lkas): values = {} if CP.flags & MazdaFlags.GEN1: values = { - "LKAS_REQUEST": apply_torque, + "LKAS_REQUEST": apply_steer, "CTR": ctr, "ERR_BIT_1": er1, "LINE_NOT_VISIBLE" : lnv, diff --git a/opendbc/car/nissan/carcontroller.py b/opendbc/car/nissan/carcontroller.py index 74c6041b4bb..3ca2ef8e301 100644 --- a/opendbc/car/nissan/carcontroller.py +++ b/opendbc/car/nissan/carcontroller.py @@ -1,3 +1,4 @@ +import numpy as np from opendbc.can.packer import CANPacker from opendbc.car import Bus, apply_std_steer_angle_limits, structs from opendbc.car.interfaces import CarControllerBase @@ -12,6 +13,7 @@ def __init__(self, dbc_names, CP): super().__init__(dbc_names, CP) self.car_fingerprint = CP.carFingerprint + self.lkas_max_torque = 0 self.apply_angle_last = 0 self.packer = CANPacker(dbc_names[Bus.pt]) @@ -26,24 +28,29 @@ def update(self, CC, CS, now_nanos): ### STEER ### steer_hud_alert = 1 if hud_control.visualAlert in (VisualAlert.steerRequired, VisualAlert.ldw) else 0 - # windup slower - self.apply_angle_last = apply_std_steer_angle_limits(actuators.steeringAngleDeg, self.apply_angle_last, CS.out.vEgoRaw, - CS.out.steeringAngleDeg, CC.latActive, CarControllerParams.ANGLE_LIMITS) - - lkas_max_torque = 0 if CC.latActive: + # windup slower + apply_angle = apply_std_steer_angle_limits(actuators.steeringAngleDeg, self.apply_angle_last, CS.out.vEgoRaw, CarControllerParams) + # Max torque from driver before EPS will give up and not apply torque if not bool(CS.out.steeringPressed): - lkas_max_torque = CarControllerParams.LKAS_MAX_TORQUE + self.lkas_max_torque = CarControllerParams.LKAS_MAX_TORQUE else: # Scale max torque based on how much torque the driver is applying to the wheel - lkas_max_torque = max( + self.lkas_max_torque = max( # Scale max torque down to half LKAX_MAX_TORQUE as a minimum CarControllerParams.LKAS_MAX_TORQUE * 0.5, # Start scaling torque at STEER_THRESHOLD CarControllerParams.LKAS_MAX_TORQUE - 0.6 * max(0, abs(CS.out.steeringTorque) - CarControllerParams.STEER_THRESHOLD) ) + else: + apply_angle = CS.out.steeringAngleDeg + self.lkas_max_torque = 0 + + apply_angle = float(np.clip(apply_angle, -CarControllerParams.MAX_STEER_ANGLE, CarControllerParams.MAX_STEER_ANGLE)) + self.apply_angle_last = apply_angle + if self.CP.carFingerprint in (CAR.NISSAN_ROGUE, CAR.NISSAN_XTRAIL, CAR.NISSAN_ALTIMA) and pcm_cancel_cmd: can_sends.append(nissancan.create_acc_cancel_cmd(self.packer, self.car_fingerprint, CS.cruise_throttle_msg)) @@ -55,7 +62,7 @@ def update(self, CC, CS, now_nanos): can_sends.append(nissancan.create_cancel_msg(self.packer, CS.cancel_msg, pcm_cancel_cmd)) can_sends.append(nissancan.create_steering_control( - self.packer, self.apply_angle_last, self.frame, CC.latActive, lkas_max_torque)) + self.packer, apply_angle, self.frame, CC.latActive, self.lkas_max_torque)) # Below are the HUD messages. We copy the stock message and modify if self.CP.carFingerprint != CAR.NISSAN_ALTIMA: @@ -69,7 +76,7 @@ def update(self, CC, CS, now_nanos): )) new_actuators = actuators.as_builder() - new_actuators.steeringAngleDeg = self.apply_angle_last + new_actuators.steeringAngleDeg = apply_angle self.frame += 1 return new_actuators, can_sends diff --git a/opendbc/car/nissan/carstate.py b/opendbc/car/nissan/carstate.py index edbd68efbaf..49bdc43a1a9 100644 --- a/opendbc/car/nissan/carstate.py +++ b/opendbc/car/nissan/carstate.py @@ -53,11 +53,9 @@ def update(self, can_parsers) -> structs.CarState: cp.vl["WHEEL_SPEEDS_REAR"]["WHEEL_SPEED_RL"], cp.vl["WHEEL_SPEEDS_REAR"]["WHEEL_SPEED_RR"], ) - # safety uses the rear wheel speeds for the speed measurement and angle limiting - ret.vEgoRaw = (ret.wheelSpeeds.rl + ret.wheelSpeeds.rr) / 2.0 + ret.vEgoRaw = (ret.wheelSpeeds.fl + ret.wheelSpeeds.fr + ret.wheelSpeeds.rl + ret.wheelSpeeds.rr) / 4. - v_ego_raw_full = (ret.wheelSpeeds.fl + ret.wheelSpeeds.fr + ret.wheelSpeeds.rl + ret.wheelSpeeds.rr) / 4.0 - ret.vEgo, ret.aEgo = self.update_speed_kf(v_ego_raw_full) + ret.vEgo, ret.aEgo = self.update_speed_kf(ret.vEgoRaw) ret.standstill = cp.vl["WHEEL_SPEEDS_REAR"]["WHEEL_SPEED_RL"] == 0.0 and cp.vl["WHEEL_SPEEDS_REAR"]["WHEEL_SPEED_RR"] == 0.0 if self.CP.carFingerprint == CAR.NISSAN_ALTIMA: diff --git a/opendbc/car/nissan/fingerprints.py b/opendbc/car/nissan/fingerprints.py index ab1ae08abee..9cef01cec46 100644 --- a/opendbc/car/nissan/fingerprints.py +++ b/opendbc/car/nissan/fingerprints.py @@ -75,19 +75,16 @@ CAR.NISSAN_LEAF_IC: { (Ecu.fwdCamera, 0x707, None): [ b'5SH1BDB\x04\x18\x00\x00\x00\x00\x00_-?\x04\x91\xf2\x00\x00\x00\x80', - b'5SH3BDB\x04\x18\x00\x00\x00\x00\x00_-?\x04\x91\xf2\x00\x00\x00\x80', b'5SH4BDB\x04\x18\x00\x00\x00\x00\x00_-?\x04\x91\xf2\x00\x00\x00\x80', b'5SK0ADB\x04\x18\x00\x00\x00\x00\x00_(5\x07\x9aQ\x00\x00\x00\x80', ], (Ecu.abs, 0x740, None): [ b'476605SD2E', b'476605SH1D', - b'476605SH7D', b'476605SK2A', ], (Ecu.eps, 0x742, None): [ b'5SH2A\x99A\x05\x02N123F\x15\x81\x00\x00\x00\x00\x00\x00\x00\x80', - b'5SH2A\xb7A\x05\x02N123F\x15\xa3\x00\x00\x00\x00\x00\x00\x00\x80', b'5SH2C\xb7A\x05\x02N123F\x15\xa3\x00\x00\x00\x00\x00\x00\x00\x80', b'5SK3A\x99A\x05\x02N123F\x15u\x00\x00\x00\x00\x00\x00\x00\x80', ], @@ -95,7 +92,6 @@ b'284U25SF0C', b'284U25SH3A', b'284U25SK2D', - b'284U25SR0B', ], }, CAR.NISSAN_XTRAIL: { diff --git a/opendbc/car/nissan/interface.py b/opendbc/car/nissan/interface.py index 78f7b88aed1..af1b89562f4 100644 --- a/opendbc/car/nissan/interface.py +++ b/opendbc/car/nissan/interface.py @@ -20,6 +20,6 @@ def _get_params(ret: structs.CarParams, candidate, fingerprint, car_fw, experime if candidate == CAR.NISSAN_ALTIMA: # Altima has EPS on C-CAN unlike the others that have it on V-CAN - ret.safetyConfigs[0].safetyParam |= NissanSafetyFlags.ALT_EPS_BUS.value + ret.safetyConfigs[0].safetyParam |= NissanSafetyFlags.FLAG_NISSAN_ALT_EPS_BUS.value return ret diff --git a/opendbc/car/nissan/nissancan.py b/opendbc/car/nissan/nissancan.py index 0c95ad1854f..555020d858b 100644 --- a/opendbc/car/nissan/nissancan.py +++ b/opendbc/car/nissan/nissancan.py @@ -5,10 +5,10 @@ nissan_checksum = crcmod.mkCrcFun(0x11d, initCrc=0x00, rev=False, xorOut=0xff) -def create_steering_control(packer, apply_torque, frame, steer_on, lkas_max_torque): +def create_steering_control(packer, apply_steer, frame, steer_on, lkas_max_torque): values = { "COUNTER": frame % 0x10, - "DESIRED_ANGLE": apply_torque, + "DESIRED_ANGLE": apply_steer, "SET_0x80_2": 0x80, "SET_0x80": 0x80, "MAX_TORQUE": lkas_max_torque if steer_on else 0, diff --git a/opendbc/car/nissan/values.py b/opendbc/car/nissan/values.py index f16cd442e97..20225941fc7 100644 --- a/opendbc/car/nissan/values.py +++ b/opendbc/car/nissan/values.py @@ -1,7 +1,7 @@ from dataclasses import dataclass, field from enum import IntFlag -from opendbc.car import AngleSteeringLimits, Bus, CarSpecs, DbcDict, PlatformConfig, Platforms, uds +from opendbc.car import AngleRateLimit, Bus, CarSpecs, DbcDict, PlatformConfig, Platforms, uds from opendbc.car.structs import CarParams from opendbc.car.docs_definitions import CarDocs, CarHarness, CarParts from opendbc.car.fw_query_definitions import FwQueryConfig, Request, StdQueries @@ -10,23 +10,21 @@ class CarControllerParams: - ANGLE_LIMITS: AngleSteeringLimits = AngleSteeringLimits( - # When output steering Angle not within range -1311 and 1310, - # CANPacker packs wrong angle output to be decoded by panda - 600, # deg, reasonable limit - ([0., 5., 15.], [5., .8, .15]), - ([0., 5., 15.], [5., 3.5, 0.4]), - ) - + ANGLE_RATE_LIMIT_UP = AngleRateLimit(speed_bp=[0., 5., 15.], angle_v=[5., .8, .15]) + ANGLE_RATE_LIMIT_DOWN = AngleRateLimit(speed_bp=[0., 5., 15.], angle_v=[5., 3.5, 0.4]) LKAS_MAX_TORQUE = 1 # A value of 1 is easy to overpower STEER_THRESHOLD = 1.0 + # When output steering Angle not within range -1311 and 1310, + # CANPacker packs wrong angle output to be decoded by panda + MAX_STEER_ANGLE = 1310 + def __init__(self, CP): pass class NissanSafetyFlags(IntFlag): - ALT_EPS_BUS = 1 + FLAG_NISSAN_ALT_EPS_BUS = 1 @dataclass diff --git a/opendbc/car/panda_runner.py b/opendbc/car/panda_runner.py index f9acb1ad5e0..01ae2d4c01c 100644 --- a/opendbc/car/panda_runner.py +++ b/opendbc/car/panda_runner.py @@ -5,6 +5,7 @@ from opendbc.car.car_helpers import get_car from opendbc.car.can_definitions import CanData from opendbc.car.structs import CarParams, CarControl +from opendbc.safety import Safety class PandaRunner(AbstractContextManager): def __enter__(self): @@ -12,19 +13,19 @@ def __enter__(self): self.p.reset() # setup + fingerprinting - self.p.set_safety_mode(CarParams.SafetyModel.elm327, 1) + self.p.set_safety_mode(Safety.SAFETY_ELM327, 1) self.CI = get_car(self._can_recv, self.p.can_send_many, self.p.set_obd, True) assert self.CI.CP.carFingerprint.lower() != "mock", "Unable to identify car. Check connections and ensure car is supported." - safety_model = self.CI.CP.safetyConfigs[0].safetyModel - self.p.set_safety_mode(CarParams.SafetyModel.elm327, 1) + safety_model = CarParams.SafetyModel.schema.enumerants[self.CI.CP.safetyConfigs[0].safetyModel] + self.p.set_safety_mode(Safety.SAFETY_ELM327, 1) self.CI.init(self.CI.CP, self._can_recv, self.p.can_send_many) self.p.set_safety_mode(safety_model, self.CI.CP.safetyConfigs[0].safetyParam) return self def __exit__(self, exc_type, exc_value, traceback): - self.p.set_safety_mode(CarParams.SafetyModel.noOutput) + self.p.set_safety_mode(Safety.SAFETY_NOOUTPUT) self.p.reset() # avoid siren return super().__exit__(exc_type, exc_value, traceback) diff --git a/opendbc/car/rivian/carcontroller.py b/opendbc/car/rivian/carcontroller.py index 88289582713..52489d9ef7c 100644 --- a/opendbc/car/rivian/carcontroller.py +++ b/opendbc/car/rivian/carcontroller.py @@ -1,53 +1,40 @@ from opendbc.can.packer import CANPacker -from opendbc.car import Bus, apply_driver_steer_torque_limits +from opendbc.car import Bus, apply_driver_steer_torque_limits, structs from opendbc.car.interfaces import CarControllerBase -from opendbc.car.rivian.riviancan import create_lka_steering, create_longitudinal, create_wheel_touch, create_adas_status +from opendbc.car.rivian.riviancan import create_lka_steering, create_longitudinal from opendbc.car.rivian.values import CarControllerParams +LongCtrlState = structs.CarControl.Actuators.LongControlState + class CarController(CarControllerBase): def __init__(self, dbc_names, CP): super().__init__(dbc_names, CP) - self.apply_torque_last = 0 + self.apply_steer_last = 0 self.packer = CANPacker(dbc_names[Bus.pt]) - self.cancel_frames = 0 - def update(self, CC, CS, now_nanos): actuators = CC.actuators can_sends = [] - apply_torque = 0 + apply_steer = 0 if CC.latActive: - new_torque = int(round(CC.actuators.torque * CarControllerParams.STEER_MAX)) - apply_torque = apply_driver_steer_torque_limits(new_torque, self.apply_torque_last, - CS.out.steeringTorque, CarControllerParams) + new_steer = int(round(CC.actuators.steer * CarControllerParams.STEER_MAX)) + apply_steer = apply_driver_steer_torque_limits(new_steer, self.apply_steer_last, + CS.out.steeringTorque, CarControllerParams) # send steering command - self.apply_torque_last = apply_torque - can_sends.append(create_lka_steering(self.packer, CS.acm_lka_hba_cmd, apply_torque, CC.latActive)) - - if self.frame % 5 == 0: - can_sends.append(create_wheel_touch(self.packer, CS.sccm_wheel_touch, CC.enabled)) + self.apply_steer_last = apply_steer + can_sends.append(create_lka_steering(self.packer, CS.acm_lka_hba_cmd, apply_steer, CC.latActive)) # Longitudinal control if self.CP.openpilotLongitudinalControl: - can_sends.append(create_longitudinal(self.packer, self.frame % 15, actuators.accel, CC.enabled)) - else: - interface_status = None - if CC.cruiseControl.cancel: - # if there is a noEntry, we need to send a status of "available" before the ACM will accept "unavailable" - # send "available" right away as the VDM itself takes a few frames to acknowledge - interface_status = 1 if self.cancel_frames < 5 else 0 - self.cancel_frames += 1 - else: - self.cancel_frames = 0 - - can_sends.append(create_adas_status(self.packer, CS.vdm_adas_status, interface_status)) + stopping = actuators.longControlState == LongCtrlState.stopping + can_sends.append(create_longitudinal(self.packer, self.frame % 15, actuators.accel, CC.enabled, stopping)) new_actuators = actuators.as_builder() - new_actuators.torque = apply_torque / CarControllerParams.STEER_MAX - new_actuators.torqueOutputCan = apply_torque + new_actuators.steer = apply_steer / CarControllerParams.STEER_MAX + new_actuators.steerOutputCan = apply_steer self.frame += 1 return new_actuators, can_sends diff --git a/opendbc/car/rivian/carstate.py b/opendbc/car/rivian/carstate.py index e47e8117002..a766fb73d24 100644 --- a/opendbc/car/rivian/carstate.py +++ b/opendbc/car/rivian/carstate.py @@ -5,8 +5,6 @@ from opendbc.car.rivian.values import DBC, GEAR_MAP from opendbc.car.common.conversions import Conversions as CV -GearShifter = structs.CarState.GearShifter - class CarState(CarStateBase): def __init__(self, CP): @@ -14,8 +12,6 @@ def __init__(self, CP): self.last_speed = 30 self.acm_lka_hba_cmd = None - self.sccm_wheel_touch = None - self.vdm_adas_status = None def update(self, can_parsers) -> structs.CarState: cp = can_parsers[Bus.pt] @@ -41,7 +37,7 @@ def update(self, can_parsers) -> structs.CarState: ret.steeringAngleDeg = cp.vl["EPAS_AdasStatus"]["EPAS_InternalSas"] ret.steeringRateDeg = cp.vl["EPAS_AdasStatus"]["EPAS_SteeringAngleSpeed"] ret.steeringTorque = cp.vl["EPAS_SystemStatus"]["EPAS_TorsionBarTorque"] - ret.steeringPressed = self.update_steering_pressed(abs(ret.steeringTorque) > 1.0, 5) + ret.steeringPressed = abs(ret.steeringTorque) > 1.0 ret.steerFaultTemporary = cp.vl["EPAS_AdasStatus"]["EPAS_EacErrorCode"] != 0 @@ -49,29 +45,16 @@ def update(self, can_parsers) -> structs.CarState: speed = min(int(cp_adas.vl["ACM_tsrCmd"]["ACM_tsrSpdDisClsMain"]), 85) self.last_speed = speed if speed != 0 else self.last_speed ret.cruiseState.enabled = cp_cam.vl["ACM_Status"]["ACM_FeatureStatus"] == 1 - # TODO: find cruise set speed on CAN ret.cruiseState.speed = self.last_speed * CV.MPH_TO_MS # detected speed limit - if not self.CP.openpilotLongitudinalControl: - ret.cruiseState.speed = -1 ret.cruiseState.available = True # cp.vl["VDM_AdasSts"]["VDM_AdasInterfaceStatus"] == 1 ret.cruiseState.standstill = cp.vl["VDM_AdasSts"]["VDM_AdasAccelRequestAcknowledged"] == 1 - - # TODO: log ACM_Unkown2=3 as a fault. need to filter it at the start and end of routes though - # ACM_FaultStatus hasn't been seen yet - ret.accFaulted = (cp_cam.vl["ACM_Status"]["ACM_FaultStatus"] == 1 or - # VDM_AdasFaultStatus=Brk_Intv is the default for some reason - # VDM_AdasFaultStatus=Imps_Cmd was seen when sending it rapidly changing ACC enable commands - # VDM_AdasFaultStatus=Cntr_Fault isn't fully understood, but we've seen it in the wild - cp.vl["VDM_AdasSts"]["VDM_AdasFaultStatus"] in (3,)) # 3=Imps_Cmd + ret.accFaulted = cp_cam.vl["ACM_Status"]["ACM_FaultStatus"] == 1 # Gear - ret.gearShifter = GEAR_MAP.get(int(cp.vl["VDM_PropStatus"]["VDM_Prndl_Status"]), GearShifter.unknown) + ret.gearShifter = GEAR_MAP[int(cp.vl["VDM_PropStatus"]["VDM_Prndl_Status"])] # Doors - ret.doorOpen = (cp_adas.vl["IndicatorLights"]["RearDriverDoor"] != 2 or - cp_adas.vl["IndicatorLights"]["FrontPassengerDoor"] != 2 or - cp_adas.vl["IndicatorLights"]["DriverDoor"] != 2 or - cp_adas.vl["IndicatorLights"]["RearPassengerDoor"] != 2) + ret.doorOpen = cp.vl["DoorStatus"]["DoorOpen"] == 1 # Blinkers ret.leftBlinker = cp_adas.vl["IndicatorLights"]["TurnLightLeft"] in (1, 2) @@ -89,8 +72,6 @@ def update(self, can_parsers) -> structs.CarState: # Messages needed by carcontroller self.acm_lka_hba_cmd = copy.copy(cp_cam.vl["ACM_lkaHbaCmd"]) - self.sccm_wheel_touch = copy.copy(cp.vl["SCCM_WheelTouch"]) - self.vdm_adas_status = copy.copy(cp.vl["VDM_AdasSts"]) return ret @@ -106,7 +87,7 @@ def get_can_parsers(CP): ("EPAS_SystemStatus", 100), ("RCM_Status", 8), ("VDM_AdasSts", 100), - ("SCCM_WheelTouch", 20), + ("DoorStatus", 10) ] cam_messages = [ diff --git a/opendbc/car/rivian/fingerprints.py b/opendbc/car/rivian/fingerprints.py index c695eaa9200..6201d47ec35 100644 --- a/opendbc/car/rivian/fingerprints.py +++ b/opendbc/car/rivian/fingerprints.py @@ -1,12 +1,2 @@ -from opendbc.car.structs import CarParams -from opendbc.car.rivian.values import CAR - -Ecu = CarParams.Ecu - FW_VERSIONS = { - CAR.RIVIAN_R1_GEN1: { - (Ecu.eps, 0x733, None): [ - b'R1TS_v3.4.1(51),3.4.1\x00', - ], - }, } diff --git a/opendbc/car/rivian/interface.py b/opendbc/car/rivian/interface.py index 2322e935595..9fdc56bc214 100644 --- a/opendbc/car/rivian/interface.py +++ b/opendbc/car/rivian/interface.py @@ -10,6 +10,9 @@ def _get_params(ret: structs.CarParams, candidate, fingerprint, car_fw, experime ret.safetyConfigs = [get_safety_config(structs.CarParams.SafetyModel.rivian)] + # pending validation + ret.dashcamOnly = True + ret.steerActuatorDelay = 0.25 ret.steerLimitTimer = 0.4 CarInterfaceBase.configure_torque_tune(candidate, ret.lateralTuning) @@ -17,7 +20,6 @@ def _get_params(ret: structs.CarParams, candidate, fingerprint, car_fw, experime ret.steerControlType = structs.CarParams.SteerControlType.torque ret.radarUnavailable = True - # TODO: pending finding/handling missing set speed and fixing up radar parser ret.experimentalLongitudinalAvailable = False if experimental_long: ret.openpilotLongitudinalControl = True diff --git a/opendbc/car/rivian/radar_interface.py b/opendbc/car/rivian/radar_interface.py index e1f9f427487..7bcf5be47aa 100644 --- a/opendbc/car/rivian/radar_interface.py +++ b/opendbc/car/rivian/radar_interface.py @@ -1,74 +1,5 @@ -import math - -from opendbc.can.parser import CANParser -from opendbc.car import Bus, structs from opendbc.car.interfaces import RadarInterfaceBase -from opendbc.car.rivian.values import DBC - -RADAR_START_ADDR = 0x500 -RADAR_MSG_COUNT = 32 - -def get_radar_can_parser(CP): - messages = [(f"RADAR_TRACK_{addr:x}", 20) for addr in range(RADAR_START_ADDR, RADAR_START_ADDR + RADAR_MSG_COUNT)] - return CANParser(DBC[CP.carFingerprint][Bus.radar], messages, 1) class RadarInterface(RadarInterfaceBase): - def __init__(self, CP): - super().__init__(CP) - self.updated_messages = set() - self.trigger_msg = RADAR_START_ADDR + RADAR_MSG_COUNT - 1 - self.track_id = 0 - - self.radar_off_can = CP.radarUnavailable - self.rcp = get_radar_can_parser(CP) - - def update(self, can_strings): - if self.radar_off_can or (self.rcp is None): - return super().update(None) - - vls = self.rcp.update_strings(can_strings) - self.updated_messages.update(vls) - - if self.trigger_msg not in self.updated_messages: - return None - - rr = self._update(self.updated_messages) - self.updated_messages.clear() - - return rr - - def _update(self, updated_messages): - ret = structs.RadarData() - if self.rcp is None: - return ret - - errors = [] - - if not self.rcp.can_valid: - errors.append("canError") - ret.errors = errors - - for addr in range(RADAR_START_ADDR, RADAR_START_ADDR + RADAR_MSG_COUNT): - msg = self.rcp.vl[f"RADAR_TRACK_{addr:x}"] - - if addr not in self.pts: - self.pts[addr] = structs.RadarData.RadarPoint() - self.pts[addr].trackId = self.track_id - self.track_id += 1 - - valid = msg['STATE'] in (3, 4) and msg['STATE_2'] == 1 - if valid: - azimuth = math.radians(msg['AZIMUTH']) - self.pts[addr].measured = True - self.pts[addr].dRel = math.cos(azimuth) * msg['LONG_DIST'] - self.pts[addr].yRel = 0.5 * -math.sin(azimuth) * msg['LONG_DIST'] - self.pts[addr].vRel = msg['REL_SPEED'] - self.pts[addr].aRel = float('nan') - self.pts[addr].yvRel = float('nan') - - else: - del self.pts[addr] - - ret.points = list(self.pts.values()) - return ret + pass diff --git a/opendbc/car/rivian/riviancan.py b/opendbc/car/rivian/riviancan.py index 9961306c7ef..0f7248d6df7 100644 --- a/opendbc/car/rivian/riviancan.py +++ b/opendbc/car/rivian/riviancan.py @@ -11,7 +11,7 @@ def checksum(data, poly, xor_output): return crc ^ xor_output -def create_lka_steering(packer, acm_lka_hba_cmd, apply_torque, enabled): +def create_lka_steering(packer, acm_lka_hba_cmd, apply_steer, enabled): values = {s: acm_lka_hba_cmd[s] for s in [ "ACM_lkaHbaCmd_Counter", "ACM_lkaHbaCmd_Checksum", @@ -40,7 +40,7 @@ def create_lka_steering(packer, acm_lka_hba_cmd, apply_torque, enabled): values["ACM_lkaActToi"] = 1 values["ACM_lkaSymbolState"] = 3 values["ACM_lkaLaneRecogState"] = 3 - values["ACM_lkaStrToqReq"] = apply_torque + values["ACM_lkaStrToqReq"] = apply_steer values["ACM_unkown2"] = 1 values["ACM_unkown3"] = 4 values["ACM_unkown4"] = 160 @@ -51,58 +51,16 @@ def create_lka_steering(packer, acm_lka_hba_cmd, apply_torque, enabled): return packer.make_can_msg("ACM_lkaHbaCmd", 0, values) -def create_wheel_touch(packer, sccm_wheel_touch, enabled): - values = {s: sccm_wheel_touch[s] for s in ( - "SCCM_WheelTouch_Counter", - "SCCM_WheelTouch_HandsOn", - "SCCM_WheelTouch_CapacitiveValue", - "SETME_X52", - )} - - # When only using ACC without lateral, the ACM warns the driver to hold the steering wheel on engagement - # Tell the ACM that the user is holding the wheel to avoid this warning - if enabled: - values["SCCM_WheelTouch_HandsOn"] = 1 - values["SCCM_WheelTouch_CapacitiveValue"] = 100 # only need to send this value, but both are set for consistency - - data = packer.make_can_msg("SCCM_WheelTouch", 2, values)[1] - values["SCCM_WheelTouch_Checksum"] = checksum(data[1:], 0x1D, 0x97) - return packer.make_can_msg("SCCM_WheelTouch", 2, values) - - -def create_longitudinal(packer, frame, accel, enabled): +def create_longitudinal(packer, frame, accel, enabled, stopping): values = { "ACM_longitudinalRequest_Counter": frame % 15, "ACM_AccelerationRequest": accel if enabled else 0, "ACM_VehicleHoldRequired": 0, "ACM_PrndRequired": 0, "ACM_longInterfaceEnable": 1 if enabled else 0, - "ACM_AccelerationRequestType": 0, + "ACM_AccelerationRequestType": 1 if stopping else 0, } data = packer.make_can_msg("ACM_longitudinalRequest", 0, values)[1] values["ACM_longitudinalRequest_Checksum"] = checksum(data[1:], 0x1D, 0x12) return packer.make_can_msg("ACM_longitudinalRequest", 0, values) - - -def create_adas_status(packer, vdm_adas_status, interface_status): - values = {s: vdm_adas_status[s] for s in ( - "VDM_AdasStatus_Checksum", - "VDM_AdasStatus_Counter", - "VDM_AdasDecelLimit", - "VDM_AdasDriverAccelPriorityStatus", - "VDM_AdasFaultStatus", - "VDM_AdasAccelLimit", - "VDM_AdasDriverModeStatus", - "VDM_AdasAccelRequest", - "VDM_AdasInterfaceStatus", - "VDM_AdasAccelRequestAcknowledged", - "VDM_AdasVehicleHoldStatus", - )} - - if interface_status is not None: - values["VDM_AdasInterfaceStatus"] = interface_status - - data = packer.make_can_msg("VDM_AdasSts", 2, values)[1] - values["VDM_AdasStatus_Checksum"] = checksum(data[1:], 0x1D, 0xD1) - return packer.make_can_msg("VDM_AdasSts", 2, values) diff --git a/opendbc/car/rivian/tests/__init__.py b/opendbc/car/rivian/tests/__init__.py deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/opendbc/car/rivian/tests/test_rivian.py b/opendbc/car/rivian/tests/test_rivian.py deleted file mode 100644 index 90dcfcd5dd3..00000000000 --- a/opendbc/car/rivian/tests/test_rivian.py +++ /dev/null @@ -1,23 +0,0 @@ -from opendbc.car.rivian.fingerprints import FW_VERSIONS -from opendbc.car.rivian.values import CAR, FW_QUERY_CONFIG, WMI, ModelLine, ModelYear - - -class TestRivian: - def test_custom_fuzzy_fingerprinting(self, subtests): - for platform in CAR: - with subtests.test(platform=platform.name): - for wmi in WMI: - for line in ModelLine: - for year in ModelYear: - for bad in (True, False): - vin = ["0"] * 17 - vin[:3] = wmi - vin[3] = line.value - vin[9] = year.value - if bad: - vin[3] = "Z" - vin = "".join(vin) - - matches = FW_QUERY_CONFIG.match_fw_to_car_fuzzy({}, vin, FW_VERSIONS) - should_match = year != ModelYear.S_2025 and not bad - assert (matches == {platform}) == should_match, "Bad match" diff --git a/opendbc/car/rivian/values.py b/opendbc/car/rivian/values.py index c0fdb8bb20d..29f64404277 100644 --- a/opendbc/car/rivian/values.py +++ b/opendbc/car/rivian/values.py @@ -1,10 +1,13 @@ from dataclasses import dataclass, field -from enum import StrEnum, IntFlag +from enum import StrEnum -from opendbc.car import Bus, CarSpecs, DbcDict, PlatformConfig, Platforms, structs -from opendbc.car.docs_definitions import CarHarness, CarDocs, CarParts, Device -from opendbc.car.fw_query_definitions import FwQueryConfig, Request, StdQueries -from opendbc.car.vin import Vin +from opendbc.car.structs import CarParams +from opendbc.car import Bus, structs +from opendbc.car import CarSpecs, PlatformConfig, Platforms +from opendbc.car.docs_definitions import CarHarness, CarDocs, CarParts +from opendbc.car.fw_query_definitions import FwQueryConfig + +Ecu = CarParams.Ecu class WMI(StrEnum): @@ -12,102 +15,49 @@ class WMI(StrEnum): RIVIAN_MPV = "7PD" -class ModelLine(StrEnum): - R1T = "T" # R1T 4-door Pickup Truck - R1S = "S" # R1S 4-door MPV - - -class ModelYear(StrEnum): - N_2022 = "N" - P_2023 = "P" - R_2024 = "R" - S_2025 = "S" - - @dataclass class RivianCarDocs(CarDocs): package: str = "All" - car_parts: CarParts = field(default_factory=CarParts([Device.threex_angled_mount, CarHarness.rivian])) - - -@dataclass -class RivianPlatformConfig(PlatformConfig): - dbc_dict: DbcDict = field(default_factory=lambda: {Bus.pt: 'rivian_primary_actuator', Bus.radar: 'rivian_mando_front_radar_generated'}) - wmis: set[WMI] = field(default_factory=set) - lines: set[ModelLine] = field(default_factory=set) - years: set[ModelYear] = field(default_factory=set) + car_parts: CarParts = field(default_factory=CarParts.common([CarHarness.rivian])) class CAR(Platforms): - RIVIAN_R1_GEN1 = RivianPlatformConfig( + RIVIAN_R1_GEN1 = PlatformConfig( # TODO: verify this [ RivianCarDocs("Rivian R1S 2022-24"), RivianCarDocs("Rivian R1T 2022-24"), ], CarSpecs(mass=3206., wheelbase=3.08, steerRatio=15.2), - wmis={WMI.RIVIAN_TRUCK, WMI.RIVIAN_MPV}, - lines={ModelLine.R1T, ModelLine.R1S}, - years={ModelYear.N_2022, ModelYear.P_2023, ModelYear.R_2024}, + {Bus.pt: 'rivian_can'} ) -def match_fw_to_car_fuzzy(live_fw_versions, vin, offline_fw_versions) -> set[str]: - # Rivian VIN reference: https://www.rivianforums.com/forum/threads/rivian-vin-decoder.1546 - vin_obj = Vin(vin) - line = vin_obj.vds[:1] - year = vin_obj.vis[:1] - - candidates = set() - for platform in CAR: - if vin_obj.wmi in platform.config.wmis and line in platform.config.lines and year in platform.config.years: - candidates.add(platform) - - return {str(c) for c in candidates} - - +# TODO: Placeholder ↓ FW_QUERY_CONFIG = FwQueryConfig( requests=[ - Request( - [StdQueries.TESTER_PRESENT_REQUEST, StdQueries.SUPPLIER_SOFTWARE_VERSION_REQUEST], - [StdQueries.TESTER_PRESENT_RESPONSE, StdQueries.SUPPLIER_SOFTWARE_VERSION_RESPONSE], - rx_offset=0x40, - bus=0, - ) - ], - match_fw_to_car_fuzzy=match_fw_to_car_fuzzy, + ] ) -GEAR_MAP = { - 0: structs.CarState.GearShifter.unknown, - 1: structs.CarState.GearShifter.park, - 2: structs.CarState.GearShifter.reverse, - 3: structs.CarState.GearShifter.neutral, - 4: structs.CarState.GearShifter.drive, -} +GEAR_MAP = [ + structs.CarState.GearShifter.unknown, + structs.CarState.GearShifter.park, + structs.CarState.GearShifter.reverse, + structs.CarState.GearShifter.neutral, + structs.CarState.GearShifter.drive, +] class CarControllerParams: - # The Rivian R1T we tested on achieves slightly more lateral acceleration going left vs. right - # and lateral acceleration rises as speed increases. This value is set conservatively to - # reach a maximum of 2.5-3.0 m/s^2 turning left at 80 mph, but is less at lower speeds - STEER_MAX = 250 # ~2.5 m/s^2 - STEER_STEP = 1 - STEER_DELTA_UP = 3 # torque increase per refresh - STEER_DELTA_DOWN = 5 # torque decrease per refresh - STEER_DRIVER_ALLOWANCE = 100 # allowed driver torque before start limiting - STEER_DRIVER_MULTIPLIER = 2 # weight driver torque - STEER_DRIVER_FACTOR = 100 - - ACCEL_MIN = -3.5 # m/s^2 + STEER_MAX = 350 + STEER_DELTA_UP = 8 # torque increase per refresh + STEER_DELTA_DOWN = 8 # torque decrease per refresh + STEER_DRIVER_ALLOWANCE = 15 # allowed driver torque before start limiting + STEER_DRIVER_MULTIPLIER = 1 # weight driver torque + STEER_DRIVER_FACTOR = 1 + + ACCEL_MIN = -3.48 # m/s^2 ACCEL_MAX = 2.0 # m/s^2 - def __init__(self, CP): - pass - - -class RivianSafetyFlags(IntFlag): - LONG_CONTROL = 1 - DBC = CAR.create_dbc_map() diff --git a/opendbc/car/subaru/carcontroller.py b/opendbc/car/subaru/carcontroller.py index 7f10699a698..410d91f02cf 100644 --- a/opendbc/car/subaru/carcontroller.py +++ b/opendbc/car/subaru/carcontroller.py @@ -14,7 +14,7 @@ class CarController(CarControllerBase): def __init__(self, dbc_names, CP): super().__init__(dbc_names, CP) - self.apply_torque_last = 0 + self.apply_steer_last = 0 self.cruise_button_prev = 0 self.steer_rate_counter = 0 @@ -31,18 +31,18 @@ def update(self, CC, CS, now_nanos): # *** steering *** if (self.frame % self.p.STEER_STEP) == 0: - apply_torque = int(round(actuators.torque * self.p.STEER_MAX)) + apply_steer = int(round(actuators.steer * self.p.STEER_MAX)) # limits due to driver torque - new_torque = int(round(apply_torque)) - apply_torque = apply_driver_steer_torque_limits(new_torque, self.apply_torque_last, CS.out.steeringTorque, self.p) + new_steer = int(round(apply_steer)) + apply_steer = apply_driver_steer_torque_limits(new_steer, self.apply_steer_last, CS.out.steeringTorque, self.p) if not CC.latActive: - apply_torque = 0 + apply_steer = 0 if self.CP.flags & SubaruFlags.PREGLOBAL: - can_sends.append(subarucan.create_preglobal_steering_control(self.packer, self.frame // self.p.STEER_STEP, apply_torque, CC.latActive)) + can_sends.append(subarucan.create_preglobal_steering_control(self.packer, self.frame // self.p.STEER_STEP, apply_steer, CC.latActive)) else: apply_steer_req = CC.latActive @@ -50,11 +50,11 @@ def update(self, CC, CS, now_nanos): # Steering rate fault prevention self.steer_rate_counter, apply_steer_req = \ common_fault_avoidance(abs(CS.out.steeringRateDeg) > MAX_STEER_RATE, apply_steer_req, - self.steer_rate_counter, MAX_STEER_RATE_FRAMES) + self.steer_rate_counter, MAX_STEER_RATE_FRAMES) - can_sends.append(subarucan.create_steering_control(self.packer, apply_torque, apply_steer_req)) + can_sends.append(subarucan.create_steering_control(self.packer, apply_steer, apply_steer_req)) - self.apply_torque_last = apply_torque + self.apply_steer_last = apply_steer # *** longitudinal *** @@ -136,8 +136,8 @@ def update(self, CC, CS, now_nanos): can_sends.append(subarucan.create_es_static_2(self.packer)) new_actuators = actuators.as_builder() - new_actuators.torque = self.apply_torque_last / self.p.STEER_MAX - new_actuators.torqueOutputCan = self.apply_torque_last + new_actuators.steer = self.apply_steer_last / self.p.STEER_MAX + new_actuators.steerOutputCan = self.apply_steer_last self.frame += 1 return new_actuators, can_sends diff --git a/opendbc/car/subaru/fingerprints.py b/opendbc/car/subaru/fingerprints.py index 53f1e6f0b98..1b6971bbd35 100644 --- a/opendbc/car/subaru/fingerprints.py +++ b/opendbc/car/subaru/fingerprints.py @@ -523,7 +523,6 @@ (Ecu.fwdCamera, 0x787, None): [ b'\x04!\x01\x1eD\x07!\x00\x04,', b'\x04!\x08\x01.\x07!\x08\x022', - b'\r!\x08\x017\x00\x00\x00\x00\x00', b'\r!\x08\x017\n!\x08\x003', ], (Ecu.engine, 0x7e0, None): [ @@ -531,7 +530,6 @@ b'\xd5"a0\x07', b'\xf1"`q\x07', b'\xf1"aq\x07', - b'\xfa"`p\x07', b'\xfa"ap\x07', ], (Ecu.transmission, 0x7e1, None): [ @@ -540,7 +538,6 @@ b'\x1e\x86B0\x00', b'\x1e\x86F0\x00', b'\x1e\xf6D0\x00', - b'\x1f\xf6B1\x00', ], }, CAR.SUBARU_OUTBACK_2023: { diff --git a/opendbc/car/subaru/interface.py b/opendbc/car/subaru/interface.py index c5ac6be75cb..29c4052674a 100644 --- a/opendbc/car/subaru/interface.py +++ b/opendbc/car/subaru/interface.py @@ -28,7 +28,7 @@ def _get_params(ret: structs.CarParams, candidate: CAR, fingerprint, car_fw, exp ret.enableBsm = 0x228 in fingerprint[0] ret.safetyConfigs = [get_safety_config(structs.CarParams.SafetyModel.subaru)] if ret.flags & SubaruFlags.GLOBAL_GEN2: - ret.safetyConfigs[0].safetyParam |= SubaruSafetyFlags.GEN2.value + ret.safetyConfigs[0].safetyParam |= SubaruSafetyFlags.FLAG_SUBARU_GEN2.value ret.steerLimitTimer = 0.4 ret.steerActuatorDelay = 0.1 @@ -72,7 +72,7 @@ def _get_params(ret: structs.CarParams, candidate: CAR, fingerprint, car_fw, exp elif candidate in (CAR.SUBARU_FORESTER_PREGLOBAL, CAR.SUBARU_OUTBACK_PREGLOBAL_2018): # Outback 2018-2019 and Forester have reversed driver torque signal - ret.safetyConfigs[0].safetyParam = SubaruSafetyFlags.PREGLOBAL_REVERSED_DRIVER_TORQUE.value + ret.safetyConfigs[0].safetyParam = SubaruSafetyFlags.FLAG_SUBARU_PREGLOBAL_REVERSED_DRIVER_TORQUE.value elif candidate == CAR.SUBARU_LEGACY_PREGLOBAL: ret.steerActuatorDelay = 0.15 @@ -90,7 +90,7 @@ def _get_params(ret: structs.CarParams, candidate: CAR, fingerprint, car_fw, exp ret.flags |= SubaruFlags.DISABLE_EYESIGHT.value if ret.openpilotLongitudinalControl: - ret.safetyConfigs[0].safetyParam |= SubaruSafetyFlags.LONG.value + ret.safetyConfigs[0].safetyParam |= SubaruSafetyFlags.FLAG_SUBARU_LONG.value return ret diff --git a/opendbc/car/subaru/subarucan.py b/opendbc/car/subaru/subarucan.py index 41517aad38c..83340dc1f8d 100644 --- a/opendbc/car/subaru/subarucan.py +++ b/opendbc/car/subaru/subarucan.py @@ -4,18 +4,18 @@ VisualAlert = structs.CarControl.HUDControl.VisualAlert -def create_steering_control(packer, apply_torque, steer_req): +def create_steering_control(packer, apply_steer, steer_req): values = { - "LKAS_Output": apply_torque, + "LKAS_Output": apply_steer, "LKAS_Request": steer_req, "SET_1": 1 } return packer.make_can_msg("ES_LKAS", 0, values) -def create_steering_control_angle(packer, apply_torque, steer_req): +def create_steering_control_angle(packer, apply_steer, steer_req): values = { - "LKAS_Output": apply_torque, + "LKAS_Output": apply_steer, "LKAS_Request": steer_req, "SET_3": 3 } @@ -283,10 +283,10 @@ def subaru_preglobal_checksum(packer, values, addr, checksum_byte=7): return (sum(dat[:checksum_byte]) + sum(dat[checksum_byte+1:])) % 256 -def create_preglobal_steering_control(packer, frame, apply_torque, steer_req): +def create_preglobal_steering_control(packer, frame, apply_steer, steer_req): values = { "COUNTER": frame % 0x08, - "LKAS_Command": apply_torque, + "LKAS_Command": apply_steer, "LKAS_Active": steer_req, } values["Checksum"] = subaru_preglobal_checksum(packer, values, "ES_LKAS") diff --git a/opendbc/car/subaru/values.py b/opendbc/car/subaru/values.py index 68171c5dd5b..ca65a9e3bde 100644 --- a/opendbc/car/subaru/values.py +++ b/opendbc/car/subaru/values.py @@ -54,9 +54,9 @@ def __init__(self, CP): class SubaruSafetyFlags(IntFlag): - GEN2 = 1 - LONG = 2 - PREGLOBAL_REVERSED_DRIVER_TORQUE = 4 + FLAG_SUBARU_GEN2 = 1 + FLAG_SUBARU_LONG = 2 + FLAG_SUBARU_PREGLOBAL_REVERSED_DRIVER_TORQUE = 4 class SubaruFlags(IntFlag): diff --git a/opendbc/car/tesla/carcontroller.py b/opendbc/car/tesla/carcontroller.py index 9a16b102b44..e8c388c4eda 100644 --- a/opendbc/car/tesla/carcontroller.py +++ b/opendbc/car/tesla/carcontroller.py @@ -24,11 +24,17 @@ def update(self, CC, CS, now_nanos): lat_active = CC.latActive and not hands_on_fault if self.frame % 2 == 0: - # Angular rate limit based on speed - self.apply_angle_last = apply_std_steer_angle_limits(actuators.steeringAngleDeg, self.apply_angle_last, CS.out.vEgo, - CS.out.steeringAngleDeg, CC.latActive, CarControllerParams.ANGLE_LIMITS) + if lat_active: + # Angular rate limit based on speed + apply_angle = apply_std_steer_angle_limits(actuators.steeringAngleDeg, self.apply_angle_last, CS.out.vEgo, CarControllerParams) - can_sends.append(self.tesla_can.create_steering_control(self.apply_angle_last, lat_active, (self.frame // 2) % 16)) + # To not fault the EPS + apply_angle = float(np.clip(apply_angle, CS.out.steeringAngleDeg - 20, CS.out.steeringAngleDeg + 20)) + else: + apply_angle = CS.out.steeringAngleDeg + + self.apply_angle_last = apply_angle + can_sends.append(self.tesla_can.create_steering_control(apply_angle, lat_active, (self.frame // 2) % 16)) if self.frame % 10 == 0: can_sends.append(self.tesla_can.create_steering_allowed((self.frame // 10) % 16)) @@ -39,13 +45,13 @@ def update(self, CC, CS, now_nanos): state = 13 if cruise_cancel else 4 # 4=ACC_ON, 13=ACC_CANCEL_GENERIC_SILENT accel = float(np.clip(actuators.accel, CarControllerParams.ACCEL_MIN, CarControllerParams.ACCEL_MAX)) cntr = (self.frame // 4) % 8 - can_sends.append(self.tesla_can.create_longitudinal_command(state, accel, cntr, CS.out.vEgo, CC.longActive)) + can_sends.append(self.tesla_can.create_longitudinal_command(state, accel, cntr, CC.longActive)) else: # Increment counter so cancel is prioritized even without openpilot longitudinal if cruise_cancel: cntr = (CS.das_control["DAS_controlCounter"] + 1) % 8 - can_sends.append(self.tesla_can.create_longitudinal_command(13, 0, cntr, CS.out.vEgo, False)) + can_sends.append(self.tesla_can.create_longitudinal_command(13, 0, cntr, False)) # TODO: HUD control new_actuators = actuators.as_builder() diff --git a/opendbc/car/tesla/carstate.py b/opendbc/car/tesla/carstate.py index a374090dcba..5a66016e75b 100644 --- a/opendbc/car/tesla/carstate.py +++ b/opendbc/car/tesla/carstate.py @@ -1,4 +1,5 @@ import copy +import numpy as np from opendbc.can.can_define import CANDefine from opendbc.can.parser import CANParser from opendbc.car import Bus, structs @@ -18,6 +19,13 @@ def __init__(self, CP): self.hands_on_level = 0 self.das_control = None + def update_steering_pressed(self, steering_pressed, steering_pressed_min_count): + """Applies filtering on steering pressed for noisy driver torque signals.""" + # TODO: this differs from the base implementation by resetting the counter to 0 immediately, unify this + self.steering_pressed_cnt = self.steering_pressed_cnt + 1 if steering_pressed else 0 + self.steering_pressed_cnt = float(np.clip(self.steering_pressed_cnt, 0, steering_pressed_min_count * 2)) + return self.steering_pressed_cnt > steering_pressed_min_count + def update(self, can_parsers) -> structs.CarState: cp_party = can_parsers[Bus.party] cp_ap_party = can_parsers[Bus.ap_party] @@ -56,9 +64,9 @@ def update(self, can_parsers) -> structs.CarState: ret.cruiseState.enabled = cruise_state in ("ENABLED", "STANDSTILL", "OVERRIDE", "PRE_FAULT", "PRE_CANCEL") if speed_units == "KPH": - ret.cruiseState.speed = max(cp_party.vl["DI_state"]["DI_digitalSpeed"] * CV.KPH_TO_MS, 1e-3) + ret.cruiseState.speed = cp_party.vl["DI_state"]["DI_digitalSpeed"] * CV.KPH_TO_MS elif speed_units == "MPH": - ret.cruiseState.speed = max(cp_party.vl["DI_state"]["DI_digitalSpeed"] * CV.MPH_TO_MS, 1e-3) + ret.cruiseState.speed = cp_party.vl["DI_state"]["DI_digitalSpeed"] * CV.MPH_TO_MS ret.cruiseState.available = cruise_state == "STANDBY" or ret.cruiseState.enabled ret.cruiseState.standstill = False # This needs to be false, since we can resume from stop without sending anything special ret.standstill = cruise_state == "STANDSTILL" diff --git a/opendbc/car/tesla/fingerprints.py b/opendbc/car/tesla/fingerprints.py index b39c3f6339d..81cb49a2c88 100644 --- a/opendbc/car/tesla/fingerprints.py +++ b/opendbc/car/tesla/fingerprints.py @@ -11,21 +11,17 @@ b'TeMYG4_DCS_Update_0.0.0 (13),E4014.28.1', b'TeMYG4_DCS_Update_0.0.0 (9),E4014.26.0', b'TeMYG4_Main_0.0.0 (59),E4H014.29.0', - b'TeMYG4_Main_0.0.0 (65),E4H015.01.0', b'TeMYG4_SingleECU_0.0.0 (33),E4S014.27', ], }, CAR.TESLA_MODEL_Y: { (Ecu.eps, 0x730, None): [ b'TeM3_E014p10_0.0.0 (16),Y002.18.00', - b'TeM3_E014p10_0.0.0 (16),YP002.18.00', b'TeM3_ES014p11_0.0.0 (16),YS002.17', b'TeM3_ES014p11_0.0.0 (25),YS002.19.0', b'TeMYG4_DCS_Update_0.0.0 (13),Y4002.27.1', b'TeMYG4_DCS_Update_0.0.0 (13),Y4P002.27.1', b'TeMYG4_DCS_Update_0.0.0 (9),Y4P002.25.0', - b'TeMYG4_Legacy3Y_0.0.0 (2),Y4003.02.0', - b'TeMYG4_Legacy3Y_0.0.0 (2),Y4P003.02.0', b'TeMYG4_SingleECU_0.0.0 (33),Y4S002.26', ], }, diff --git a/opendbc/car/tesla/interface.py b/opendbc/car/tesla/interface.py index baa6a85c0eb..7c9af8ef0c8 100644 --- a/opendbc/car/tesla/interface.py +++ b/opendbc/car/tesla/interface.py @@ -9,6 +9,9 @@ class CarInterface(CarInterfaceBase): def _get_params(ret: structs.CarParams, candidate, fingerprint, car_fw, experimental_long, docs) -> structs.CarParams: ret.brand = "tesla" + # Needs safety validation and final testing before pulling out of dashcam + ret.dashcamOnly = True + ret.safetyConfigs = [get_safety_config(structs.CarParams.SafetyModel.tesla)] ret.steerLimitTimer = 1.0 @@ -20,10 +23,6 @@ def _get_params(ret: structs.CarParams, candidate, fingerprint, car_fw, experime ret.experimentalLongitudinalAvailable = True if experimental_long: ret.openpilotLongitudinalControl = True - ret.safetyConfigs[0].safetyParam |= TeslaSafetyFlags.LONG_CONTROL.value - - ret.vEgoStopping = 0.1 - ret.vEgoStarting = 0.1 - ret.stoppingDecelRate = 0.3 + ret.safetyConfigs[0].safetyParam |= TeslaSafetyFlags.FLAG_TESLA_LONG_CONTROL.value return ret diff --git a/opendbc/car/tesla/teslacan.py b/opendbc/car/tesla/teslacan.py index a5c1de13b71..cbb5783014d 100644 --- a/opendbc/car/tesla/teslacan.py +++ b/opendbc/car/tesla/teslacan.py @@ -1,4 +1,3 @@ -from opendbc.car.common.conversions import Conversions as CV from opendbc.car.interfaces import V_CRUISE_MAX from opendbc.car.tesla.values import CANBUS, CarControllerParams @@ -25,14 +24,10 @@ def create_steering_control(self, angle, enabled, counter): values["DAS_steeringControlChecksum"] = self.checksum(0x488, data[:3]) return self.packer.make_can_msg("DAS_steeringControl", CANBUS.party, values) - def create_longitudinal_command(self, acc_state, accel, cntr, v_ego, active): - set_speed = max(v_ego * CV.MS_TO_KPH, 0) - if active: - # TODO: this causes jerking after gas override when above set speed - set_speed = 0 if accel < 0 else V_CRUISE_MAX - + def create_longitudinal_command(self, acc_state, accel, cntr, active): values = { - "DAS_setSpeed": set_speed, + # TODO: this causes jerking after gas override when above set speed + "DAS_setSpeed": 0 if (accel < 0 or not active) else V_CRUISE_MAX, "DAS_accState": acc_state, "DAS_aebEvent": 0, "DAS_jerkMin": CarControllerParams.JERK_LIMIT_MIN, diff --git a/opendbc/car/tesla/values.py b/opendbc/car/tesla/values.py index 8453a73f51f..08bba5d7270 100644 --- a/opendbc/car/tesla/values.py +++ b/opendbc/car/tesla/values.py @@ -1,33 +1,16 @@ from dataclasses import dataclass, field -from enum import Enum, IntFlag -from opendbc.car import Bus, CarSpecs, DbcDict, PlatformConfig, Platforms, AngleSteeringLimits +from enum import IntFlag +from opendbc.car import Bus, CarSpecs, DbcDict, PlatformConfig, Platforms, AngleRateLimit from opendbc.car.structs import CarParams, CarState -from opendbc.car.docs_definitions import CarDocs, CarFootnote, CarHarness, CarParts, Column +from opendbc.car.docs_definitions import CarDocs from opendbc.car.fw_query_definitions import FwQueryConfig, Request, StdQueries Ecu = CarParams.Ecu -class Footnote(Enum): - HW_TYPE = CarFootnote( - "Some 2023 model years have HW4. To check which hardware type your vehicle has, look for " + - "Autopilot computer under Software -> Additional Vehicle Information on your vehicle's touchscreen.

" + - "See this page for more information.", - Column.MODEL) - - @dataclass -class TeslaCarDocsHW3(CarDocs): - package: str = "All" - car_parts: CarParts = field(default_factory=CarParts.common([CarHarness.tesla_a])) - footnotes: list[Enum] = field(default_factory=lambda: [Footnote.HW_TYPE]) - - -@dataclass -class TeslaCarDocsHW4(CarDocs): - package: str = "All" - car_parts: CarParts = field(default_factory=CarParts.common([CarHarness.tesla_b])) - footnotes: list[Enum] = field(default_factory=lambda: [Footnote.HW_TYPE]) +class TeslaCarDocs(CarDocs): + package: str = "Traffic Aware Cruise Control" @dataclass @@ -37,19 +20,11 @@ class TeslaPlatformConfig(PlatformConfig): class CAR(Platforms): TESLA_MODEL_3 = TeslaPlatformConfig( - [ - # TODO: do we support 2017? It's HW3 - # TODO: do we support 2025? It's HW4 - TeslaCarDocsHW3("Tesla Model 3 (with HW3) 2019-23"), - TeslaCarDocsHW4("Tesla Model 3 (with HW4) 2024"), - ], + [TeslaCarDocs("Tesla Model 3 2019-24")], CarSpecs(mass=1899., wheelbase=2.875, steerRatio=12.0), ) TESLA_MODEL_Y = TeslaPlatformConfig( - [ - TeslaCarDocsHW3("Tesla Model Y (with HW3) 2020-23"), - TeslaCarDocsHW4("Tesla Model Y (with HW4) 2024"), - ], + [TeslaCarDocs("Tesla Model Y 2020-24")], CarSpecs(mass=2072., wheelbase=2.890, steerRatio=12.0), ) @@ -82,17 +57,9 @@ class CANBUS: class CarControllerParams: - ANGLE_LIMITS: AngleSteeringLimits = AngleSteeringLimits( - # EPAS faults above this angle - 360, # deg - # Angle rate limits are set using the Tesla Model Y VehicleModel such that they maximally meet ISO 11270 - # At 5 m/s, FSD has been seen hitting up to ~4 deg/frame with ~5 deg/frame at very low creeping speeds - # At 30 m/s, FSD has been seen hitting mostly 0.1 deg/frame, sometimes 0.2 deg/frame, and rarely 0.3 deg/frame - ([0., 5., 25.], [2.5, 1.5, 0.2]), - ([0., 5., 25.], [5., 2.0, 0.3]), - ) - - STEER_STEP = 2 # Angle command is sent at 50 Hz + # Angle command is sent at 50 Hz + ANGLE_RATE_LIMIT_UP = AngleRateLimit(speed_bp=[0., 5., 15.], angle_v=[10., 1.6, .3]) + ANGLE_RATE_LIMIT_DOWN = AngleRateLimit(speed_bp=[0., 5., 15.], angle_v=[10., 7.0, 0.8]) ACCEL_MAX = 2.0 # m/s^2 ACCEL_MIN = -3.48 # m/s^2 JERK_LIMIT_MAX = 4.9 # m/s^3, ACC faults at 5.0 @@ -100,11 +67,11 @@ class CarControllerParams: class TeslaSafetyFlags(IntFlag): - LONG_CONTROL = 1 + FLAG_TESLA_LONG_CONTROL = 1 class TeslaFlags(IntFlag): - LONG_CONTROL = 1 + FLAG_TESLA_LONG_CONTROL = 1 DBC = CAR.create_dbc_map() diff --git a/opendbc/car/tests/routes.py b/opendbc/car/tests/routes.py index d582ec6e35a..00ef5a7eaaf 100644 --- a/opendbc/car/tests/routes.py +++ b/opendbc/car/tests/routes.py @@ -19,6 +19,7 @@ # FIXME: add routes for these cars non_tested_cars = [ MOCK.MOCK, + FORD.FORD_F_150_MK14, GM.CADILLAC_ATS, GM.HOLDEN_ASTRA, GM.CHEVROLET_MALIBU, @@ -28,6 +29,7 @@ SUBARU.SUBARU_FORESTER_HYBRID, TESLA.TESLA_MODEL_3, TESLA.TESLA_MODEL_Y, + RIVIAN.RIVIAN_R1_GEN1, ] @@ -57,7 +59,6 @@ class CarTestRoute(NamedTuple): CarTestRoute("e886087f430e7fe7|2023-06-16--23-06-36", FORD.FORD_FOCUS_MK4), CarTestRoute("bd37e43731e5964b|2023-04-30--10-42-26", FORD.FORD_MAVERICK_MK1), CarTestRoute("112e4d6e0cad05e1|2023-11-14--08-21-43", FORD.FORD_F_150_LIGHTNING_MK1), - CarTestRoute("e36b272d5679115f/00000369--a3e8499a85", FORD.FORD_F_150_MK14), CarTestRoute("83a4e056c7072678|2023-11-13--16-51-33", FORD.FORD_MUSTANG_MACH_E_MK1), CarTestRoute("37998aa0fade36ab/00000000--48f927c4f5", FORD.FORD_RANGER_MK2), #TestRoute("f1b4c567731f4a1b|2018-04-30--10-15-35", FORD.FUSION), @@ -106,7 +107,6 @@ class CarTestRoute(NamedTuple): CarTestRoute("54fd8451b3974762|2021-04-01--14-50-10", HONDA.HONDA_RIDGELINE), CarTestRoute("2d5808fae0b38ac6|2021-09-01--17-14-11", HONDA.HONDA_E), CarTestRoute("f44aa96ace22f34a|2021-12-22--06-22-31", HONDA.HONDA_CIVIC_2022), - CarTestRoute("1f032f5173c8ad99/00000006--573b3fcaf5", HONDA.HONDA_CIVIC_2022), # Civic Type R with manual transmission CarTestRoute("87d7f06ade479c2e|2023-09-11--23-30-11", HYUNDAI.HYUNDAI_AZERA_6TH_GEN), CarTestRoute("66189dd8ec7b50e6|2023-09-20--07-02-12", HYUNDAI.HYUNDAI_AZERA_HEV_6TH_GEN), @@ -117,7 +117,7 @@ class CarTestRoute(NamedTuple): CarTestRoute("afe09b9f5d3f3548/00000011--15fefe1c50", HYUNDAI.GENESIS_GV70_ELECTRIFIED_1ST_GEN), CarTestRoute("afe09b9f5d3f3548/0000001b--a1129a4a15", HYUNDAI.GENESIS_GV70_ELECTRIFIED_1ST_GEN), # openpilot longitudinal enabled CarTestRoute("6b301bf83f10aa90|2020-11-22--16-45-07", HYUNDAI.GENESIS_G80), - CarTestRoute("66eaa6c3b6b2afc6/00000009--3a5199aabe", HYUNDAI.GENESIS_G80_2ND_GEN_FL), # LKA steering + CarTestRoute("66eaa6c3b6b2afc6/00000009--3a5199aabe", HYUNDAI.GENESIS_G80_2ND_GEN_FL), # HDA2 CarTestRoute("0bbe367c98fa1538|2023-09-16--00-16-49", HYUNDAI.HYUNDAI_CUSTIN_1ST_GEN), CarTestRoute("f0709d2bc6ca451f|2022-10-15--08-13-54", HYUNDAI.HYUNDAI_SANTA_CRUZ_1ST_GEN), CarTestRoute("4dbd55df87507948|2022-03-01--09-45-38", HYUNDAI.HYUNDAI_SANTA_FE), @@ -143,8 +143,8 @@ class CarTestRoute(NamedTuple): CarTestRoute("fc19648042eb6896|2023-08-16--11-43-27", HYUNDAI.KIA_SORENTO_HEV_4TH_GEN, segment=14), CarTestRoute("628935d7d3e5f4f7|2022-11-30--01-12-46", HYUNDAI.KIA_SORENTO_HEV_4TH_GEN), # plug-in hybrid CarTestRoute("9c917ba0d42ffe78|2020-04-17--12-43-19", HYUNDAI.HYUNDAI_PALISADE), - CarTestRoute("05a8f0197fdac372|2022-10-19--14-14-09", HYUNDAI.HYUNDAI_IONIQ_5), # LKA steering - CarTestRoute("eb4eae1476647463|2023-08-26--18-07-04", HYUNDAI.HYUNDAI_IONIQ_6, segment=6), # LKA steering + CarTestRoute("05a8f0197fdac372|2022-10-19--14-14-09", HYUNDAI.HYUNDAI_IONIQ_5), # HDA2 + CarTestRoute("eb4eae1476647463|2023-08-26--18-07-04", HYUNDAI.HYUNDAI_IONIQ_6, segment=6), # HDA2 CarTestRoute("3f29334d6134fcd4|2022-03-30--22-00-50", HYUNDAI.HYUNDAI_IONIQ_PHEV_2019), CarTestRoute("fa8db5869167f821|2021-06-10--22-50-10", HYUNDAI.HYUNDAI_IONIQ_PHEV), CarTestRoute("e1107f9d04dfb1e2|2023-09-05--22-32-12", HYUNDAI.HYUNDAI_IONIQ_PHEV), # openpilot longitudinal enabled @@ -154,19 +154,16 @@ class CarTestRoute(NamedTuple): CarTestRoute("012c95f06918eca4|2023-01-15--11-19-36", HYUNDAI.HYUNDAI_IONIQ), # openpilot longitudinal enabled CarTestRoute("ab59fe909f626921|2021-10-18--18-34-28", HYUNDAI.HYUNDAI_IONIQ_HEV_2022), CarTestRoute("22d955b2cd499c22|2020-08-10--19-58-21", HYUNDAI.HYUNDAI_KONA), - CarTestRoute("0099bdb24d82951b/00000005--c38d940b04", HYUNDAI.HYUNDAI_KONA_2022), CarTestRoute("efc48acf44b1e64d|2021-05-28--21-05-04", HYUNDAI.HYUNDAI_KONA_EV), CarTestRoute("f90d3cd06caeb6fa|2023-09-06--17-15-47", HYUNDAI.HYUNDAI_KONA_EV), # openpilot longitudinal enabled CarTestRoute("ff973b941a69366f|2022-07-28--22-01-19", HYUNDAI.HYUNDAI_KONA_EV_2022, segment=11), CarTestRoute("1618132d68afc876|2023-08-27--09-32-14", HYUNDAI.HYUNDAI_KONA_EV_2ND_GEN, segment=13), CarTestRoute("49f3c13141b6bc87|2021-07-28--08-05-13", HYUNDAI.HYUNDAI_KONA_HEV), - CarTestRoute("a74afe0cf708748f/0000000e--a2885a9a71", HYUNDAI.HYUNDAI_NEXO_1ST_GEN), - CarTestRoute("a74afe0cf708748f/0000000c--b476a8fd00", HYUNDAI.HYUNDAI_NEXO_1ST_GEN), # openpilot longitudinal enabled CarTestRoute("5dddcbca6eb66c62|2020-07-26--13-24-19", HYUNDAI.KIA_STINGER), CarTestRoute("5b50b883a4259afb|2022-11-09--15-00-42", HYUNDAI.KIA_STINGER_2022), CarTestRoute("d624b3d19adce635|2020-08-01--14-59-12", HYUNDAI.HYUNDAI_VELOSTER), - CarTestRoute("d545129f3ca90f28|2022-10-19--09-22-54", HYUNDAI.KIA_EV6), # LKA steering - CarTestRoute("68d6a96e703c00c9|2022-09-10--16-09-39", HYUNDAI.KIA_EV6), # LFA steering + CarTestRoute("d545129f3ca90f28|2022-10-19--09-22-54", HYUNDAI.KIA_EV6), # HDA2 + CarTestRoute("68d6a96e703c00c9|2022-09-10--16-09-39", HYUNDAI.KIA_EV6), # HDA1 CarTestRoute("9b25e8c1484a1b67|2023-04-13--10-41-45", HYUNDAI.KIA_EV6), CarTestRoute("007d5e4ad9f86d13|2021-09-30--15-09-23", HYUNDAI.KIA_K5_2021), CarTestRoute("c58dfc9fc16590e0|2023-01-14--13-51-48", HYUNDAI.KIA_K5_HEV_2020), @@ -307,8 +304,6 @@ class CarTestRoute(NamedTuple): CarTestRoute("f6d5b1a9d7a1c92e|2021-07-08--06-56-59", MAZDA.MAZDA_CX9_2021), CarTestRoute("a4af1602d8e668ac|2022-02-03--12-17-07", MAZDA.MAZDA_CX5_2022), - CarTestRoute("bc095dc92e101734/000000db--ee9fe46e57", RIVIAN.RIVIAN_R1_GEN1), - #CarTestRoute("46cdc864ec865f4b/00000007--42f94db730", TESLA.TESLA_MODEL_Y), # Segments that test specific issues diff --git a/opendbc/car/tests/test_can_fingerprint.py b/opendbc/car/tests/test_can_fingerprint.py index 30dba600081..79863378f5c 100644 --- a/opendbc/car/tests/test_can_fingerprint.py +++ b/opendbc/car/tests/test_can_fingerprint.py @@ -1,11 +1,12 @@ -import pytest +from parameterized import parameterized + from opendbc.car.can_definitions import CanData from opendbc.car.car_helpers import FRAME_FINGERPRINT, can_fingerprint from opendbc.car.fingerprints import _FINGERPRINTS as FINGERPRINTS class TestCanFingerprint: - @pytest.mark.parametrize("car_model, fingerprints", FINGERPRINTS.items()) + @parameterized.expand(list(FINGERPRINTS.items())) def test_can_fingerprint(self, car_model, fingerprints): """Tests online fingerprinting function on offline fingerprints""" diff --git a/opendbc/car/tests/test_car_interfaces.py b/opendbc/car/tests/test_car_interfaces.py index c27cd6f4986..7016ea7a011 100644 --- a/opendbc/car/tests/test_car_interfaces.py +++ b/opendbc/car/tests/test_car_interfaces.py @@ -1,18 +1,17 @@ import os import math import hypothesis.strategies as st -import pytest from hypothesis import Phase, given, settings +from parameterized import parameterized from collections.abc import Callable from typing import Any from opendbc.car import DT_CTRL, CanData, gen_empty_fingerprint, structs from opendbc.car.car_helpers import interfaces -from opendbc.car.fingerprints import FW_VERSIONS -from opendbc.car.fw_versions import FW_QUERY_CONFIGS +from opendbc.car.fingerprints import all_known_cars +from opendbc.car.fw_versions import FW_VERSIONS, FW_QUERY_CONFIGS from opendbc.car.interfaces import get_interface_attr from opendbc.car.mock.values import CAR as MOCK -from opendbc.car.values import PLATFORMS DrawType = Callable[[st.SearchStrategy], Any] @@ -49,7 +48,7 @@ def get_fuzzy_car_interface_args(draw: DrawType) -> dict: class TestCarInterfaces: # FIXME: Due to the lists used in carParams, Phase.target is very slow and will cause # many generated examples to overrun when max_examples > ~20, don't use it - @pytest.mark.parametrize("car_name", sorted(PLATFORMS)) + @parameterized.expand([(car,) for car in sorted(all_known_cars())] + [MOCK.MOCK]) @settings(max_examples=MAX_EXAMPLES, deadline=None, phases=(Phase.reuse, Phase.generate, Phase.shrink)) @given(data=st.data()) @@ -98,8 +97,6 @@ def test_car_interfaces(self, car_name, data): CC = structs.CarControl() CC.enabled = True - CC.latActive = True - CC.longActive = True CC = CC.as_reader() for _ in range(10): car_interface.update([]) diff --git a/opendbc/car/tests/test_docs.py b/opendbc/car/tests/test_docs.py index f09e8471203..eeca3d9514b 100644 --- a/opendbc/car/tests/test_docs.py +++ b/opendbc/car/tests/test_docs.py @@ -4,7 +4,7 @@ from opendbc.car.car_helpers import interfaces from opendbc.car.docs import get_all_car_docs -from opendbc.car.docs_definitions import Cable, Column, PartType, Star, SupportType +from opendbc.car.docs_definitions import Cable, Column, PartType, Star from opendbc.car.honda.values import CAR as HONDA from opendbc.car.values import PLATFORMS @@ -18,9 +18,6 @@ def test_duplicate_years(self, subtests): make_model_years = defaultdict(list) for car in self.all_cars: with subtests.test(car_docs_name=car.name): - if car.support_type != SupportType.UPSTREAM: - pytest.skip() - make_model = (car.make, car.model) for year in car.year_list: assert year not in make_model_years[make_model], f"{car.name}: Duplicate model year" @@ -66,7 +63,7 @@ def test_year_format(self, subtests): def test_harnesses(self, subtests): for car in self.all_cars: with subtests.test(car=car.name): - if car.name == "comma body" or car.support_type != SupportType.UPSTREAM: + if car.name == "comma body": pytest.skip() car_part_type = [p.part_type for p in car.car_parts.all_parts()] diff --git a/opendbc/car/tests/test_fw_fingerprint.py b/opendbc/car/tests/test_fw_fingerprint.py index d46298dfe48..c7d4462e28c 100644 --- a/opendbc/car/tests/test_fw_fingerprint.py +++ b/opendbc/car/tests/test_fw_fingerprint.py @@ -2,6 +2,7 @@ import random import time from collections import defaultdict +from parameterized import parameterized from opendbc.car.can_definitions import CanData from opendbc.car.car_helpers import interfaces @@ -23,8 +24,7 @@ def assertFingerprints(self, candidates, expected): assert len(candidates) == 1, f"got more than one candidate: {candidates}" assert candidates[0] == expected - @pytest.mark.parametrize("brand, car_model, ecus, test_non_essential", - [(b, c, e[c], n) for b, e in VERSIONS.items() for c in e for n in (True, False)]) + @parameterized.expand([(b, c, e[c], n) for b, e in VERSIONS.items() for c in e for n in (True, False)]) def test_exact_match(self, brand, car_model, ecus, test_non_essential): config = FW_QUERY_CONFIGS[brand] CP = CarParams() @@ -48,7 +48,7 @@ def test_exact_match(self, brand, car_model, ecus, test_non_essential): if len(matches) != 0: self.assertFingerprints(matches, car_model) - @pytest.mark.parametrize("brand, car_model, ecus", [(b, c, e[c]) for b, e in VERSIONS.items() for c in e]) + @parameterized.expand([(b, c, e[c]) for b, e in VERSIONS.items() for c in e]) def test_custom_fuzzy_match(self, brand, car_model, ecus): # Assert brand-specific fuzzy fingerprinting function doesn't disagree with standard fuzzy function config = FW_QUERY_CONFIGS[brand] @@ -70,7 +70,7 @@ def test_custom_fuzzy_match(self, brand, car_model, ecus): if len(matches) == 1 and len(brand_matches) == 1: assert matches == brand_matches - @pytest.mark.parametrize("brand, car_model, ecus", [(b, c, e[c]) for b, e in VERSIONS.items() for c in e]) + @parameterized.expand([(b, c, e[c]) for b, e in VERSIONS.items() for c in e]) def test_fuzzy_match_ecu_count(self, brand, car_model, ecus): # Asserts that fuzzy matching does not count matching FW, but ECU address keys valid_ecus = [e for e in ecus if e[0] not in FUZZY_EXCLUDE_ECUS] @@ -260,7 +260,7 @@ def fake_get_ecu_addrs(*_, timeout): print(f'get_vin {name} case, query time={self.total_time / self.N} seconds') def test_fw_query_timing(self, subtests, mocker): - total_ref_time = {1: 7.1, 2: 7.7} + total_ref_time = {1: 7.0, 2: 7.6} brand_ref_times = { 1: { 'gm': 1.0, @@ -275,7 +275,7 @@ def test_fw_query_timing(self, subtests, mocker): 'tesla': 0.1, 'toyota': 0.7, 'volkswagen': 0.65, - 'rivian': 0.1, + 'rivian': 0., }, 2: { 'ford': 1.6, diff --git a/opendbc/car/tests/test_lateral_limits.py b/opendbc/car/tests/test_lateral_limits.py index cf51de803b3..a4292f6273e 100755 --- a/opendbc/car/tests/test_lateral_limits.py +++ b/opendbc/car/tests/test_lateral_limits.py @@ -7,8 +7,10 @@ from opendbc.car import DT_CTRL from opendbc.car.car_helpers import interfaces +from opendbc.car.fingerprints import all_known_cars from opendbc.car.interfaces import get_torque_params -from opendbc.car.values import PLATFORMS + +CAR_MODELS = all_known_cars() # ISO 11270 - allowed up jerk is strictly lower than recommended limits MAX_LAT_ACCEL = 3.0 # m/s^2 @@ -20,7 +22,7 @@ JERK_MEAS_T = 0.5 -@parameterized_class('car_model', [(c,) for c in sorted(PLATFORMS)]) +@parameterized_class('car_model', [(c,) for c in sorted(CAR_MODELS)]) class TestLateralLimits: car_model: str @@ -29,8 +31,8 @@ def setup_class(cls): CarInterface, _, _, _ = interfaces[cls.car_model] CP = CarInterface.get_non_essential_params(cls.car_model) - if cls.car_model == 'MOCK': - pytest.skip('Mock car') + if CP.dashcamOnly: + pytest.skip("Platform is behind dashcamOnly") # TODO: test all platforms if CP.steerControlType != 'torque': @@ -72,7 +74,7 @@ class LatAccelReport: car_model_jerks: defaultdict[str, dict[str, float]] = defaultdict(dict) def pytest_sessionfinish(self): - print(f"\n\n---- Lateral limit report ({len(PLATFORMS)} cars) ----\n") + print(f"\n\n---- Lateral limit report ({len(CAR_MODELS)} cars) ----\n") max_car_model_len = max([len(car_model) for car_model in self.car_model_jerks]) for car_model, _jerks in sorted(self.car_model_jerks.items(), key=lambda i: i[1]['up_jerk'], reverse=True): diff --git a/opendbc/car/tests/test_routes.py b/opendbc/car/tests/test_routes.py index 92176909db5..5c7ab12e835 100644 --- a/opendbc/car/tests/test_routes.py +++ b/opendbc/car/tests/test_routes.py @@ -1,10 +1,10 @@ -import pytest +from parameterized import parameterized from opendbc.car.values import PLATFORMS from opendbc.car.tests.routes import non_tested_cars, routes -@pytest.mark.parametrize("platform", PLATFORMS.keys()) +@parameterized.expand(PLATFORMS.keys()) def test_test_route_present(platform): tested_platforms = [r.car_model for r in routes] assert platform in set(tested_platforms) | set(non_tested_cars), \ diff --git a/opendbc/car/tests/test_vehicle_model.py b/opendbc/car/tests/test_vehicle_model.py deleted file mode 100644 index b88a8dab4e0..00000000000 --- a/opendbc/car/tests/test_vehicle_model.py +++ /dev/null @@ -1,67 +0,0 @@ -import pytest -import math - -import numpy as np - -from opendbc.car.honda.interface import CarInterface -from opendbc.car.honda.values import CAR -from opendbc.car.vehicle_model import VehicleModel, dyn_ss_sol, create_dyn_state_matrices - - -class TestVehicleModel: - def setup_method(self): - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - self.VM = VehicleModel(CP) - - def test_round_trip_yaw_rate(self): - # TODO: fix VM to work at zero speed - for u in np.linspace(1, 30, num=10): - for roll in np.linspace(math.radians(-20), math.radians(20), num=11): - for sa in np.linspace(math.radians(-20), math.radians(20), num=11): - yr = self.VM.yaw_rate(sa, u, roll) - new_sa = self.VM.get_steer_from_yaw_rate(yr, u, roll) - - assert sa == pytest.approx(new_sa) - - def test_dyn_ss_sol_against_yaw_rate(self): - """Verify that the yaw_rate helper function matches the results - from the state space model.""" - - for roll in np.linspace(math.radians(-20), math.radians(20), num=11): - for u in np.linspace(1, 30, num=10): - for sa in np.linspace(math.radians(-20), math.radians(20), num=11): - - # Compute yaw rate based on state space model - _, yr1 = dyn_ss_sol(sa, u, roll, self.VM) - - # Compute yaw rate using direct computations - yr2 = self.VM.yaw_rate(sa, u, roll) - assert float(yr1[0]) == pytest.approx(yr2) - - def test_syn_ss_sol_simulate(self): - """Verifies that dyn_ss_sol matches a simulation""" - - for roll in np.linspace(math.radians(-20), math.radians(20), num=11): - for u in np.linspace(1, 30, num=10): - A, B = create_dyn_state_matrices(u, self.VM) - - # Convert to discrete time system - dt = 0.01 - top = np.hstack((A, B)) - full = np.vstack((top, np.zeros_like(top))) * dt - Md = sum([np.linalg.matrix_power(full, k) / math.factorial(k) for k in range(25)]) - Ad = Md[:A.shape[0], :A.shape[1]] - Bd = Md[:A.shape[0], A.shape[1]:] - - for sa in np.linspace(math.radians(-20), math.radians(20), num=11): - inp = np.array([[sa], [roll]]) - - # Simulate for 1 second - x1 = np.zeros((2, 1)) - for _ in range(100): - x1 = Ad @ x1 + Bd @ inp - - # Compute steady state solution directly - x2 = dyn_ss_sol(sa, u, roll, self.VM) - - np.testing.assert_almost_equal(x1, x2, decimal=3) diff --git a/opendbc/car/torque_data/override.toml b/opendbc/car/torque_data/override.toml index 16e07c2a466..1d1437b7329 100644 --- a/opendbc/car/torque_data/override.toml +++ b/opendbc/car/torque_data/override.toml @@ -73,8 +73,7 @@ legend = ["LAT_ACCEL_FACTOR", "MAX_LAT_ACCEL_MEASURED", "FRICTION"] "HYUNDAI_STARIA_4TH_GEN" = [1.8, 2.0, 0.15] "GENESIS_GV70_ELECTRIFIED_1ST_GEN" = [1.9, 1.9, 0.09] "GENESIS_G80_2ND_GEN_FL" = [2.5819356441497803, 2.5, 0.11244568973779678] -"RIVIAN_R1_GEN1" = [2.8, 2.5, 0.07] -"HYUNDAI_NEXO_1ST_GEN" = [2.5, 2.5, 0.1] +"RIVIAN_R1_GEN1" = [2.5, 2.5, 0.005] # Dashcam or fallback configured as ideal car "MOCK" = [10.0, 10, 0.0] diff --git a/opendbc/car/torque_data/substitute.toml b/opendbc/car/torque_data/substitute.toml index a91ac358957..77e90f3a5a5 100644 --- a/opendbc/car/torque_data/substitute.toml +++ b/opendbc/car/torque_data/substitute.toml @@ -29,7 +29,6 @@ legend = ["LAT_ACCEL_FACTOR", "MAX_LAT_ACCEL_MEASURED", "FRICTION"] "KIA_NIRO_HEV_2021" = "KIA_NIRO_EV" "HYUNDAI_VELOSTER" = "HYUNDAI_SONATA_LF" "HYUNDAI_KONA" = "HYUNDAI_KONA_EV" -"HYUNDAI_KONA_2022" = "HYUNDAI_KONA_EV" "HYUNDAI_KONA_HEV" = "HYUNDAI_KONA_EV" "HYUNDAI_KONA_EV_2022" = "HYUNDAI_KONA_EV" "HYUNDAI_IONIQ" = "HYUNDAI_IONIQ_PHEV_2019" @@ -51,6 +50,7 @@ legend = ["LAT_ACCEL_FACTOR", "MAX_LAT_ACCEL_MEASURED", "FRICTION"] "HONDA_CIVIC_BOSCH_DIESEL" = "HONDA_CIVIC_BOSCH" "HONDA_E" = "HONDA_CIVIC_BOSCH" "HONDA_ODYSSEY_CHN" = "HONDA_ODYSSEY" +"ACURA_RDX_3G_MMR" = "ACURA_RDX_3G" "BUICK_LACROSSE" = "CHEVROLET_VOLT" "BUICK_REGAL" = "CHEVROLET_VOLT" diff --git a/opendbc/car/toyota/carcontroller.py b/opendbc/car/toyota/carcontroller.py index 8c8dfa1b31b..064c4fee09a 100644 --- a/opendbc/car/toyota/carcontroller.py +++ b/opendbc/car/toyota/carcontroller.py @@ -33,6 +33,11 @@ # EPS allows user torque above threshold for 50 frames before permanently faulting MAX_USER_TORQUE = 500 +# LTA limits +# EPS ignores commands above this angle and causes PCS to fault +MAX_LTA_ANGLE = 94.9461 # deg +MAX_LTA_DRIVER_TORQUE_ALLOWANCE = 150 # slightly above steering pressed allows some resistance when changing lanes + def get_long_tune(CP, params): if CP.carFingerprint in TSS2_CAR: @@ -51,7 +56,7 @@ class CarController(CarControllerBase): def __init__(self, dbc_names, CP): super().__init__(dbc_names, CP) self.params = CarControllerParams(self.CP) - self.last_torque = 0 + self.last_steer = 0 self.last_angle = 0 self.alert_active = False self.last_standstill = False @@ -100,36 +105,39 @@ def update(self, CC, CS, now_nanos): carlog.error("SecOC synchronization MAC mismatch, wrong key?") # *** steer torque *** - new_torque = int(round(actuators.torque * self.params.STEER_MAX)) - apply_torque = apply_meas_steer_torque_limits(new_torque, self.last_torque, CS.out.steeringTorqueEps, self.params) + new_steer = int(round(actuators.steer * self.params.STEER_MAX)) + apply_steer = apply_meas_steer_torque_limits(new_steer, self.last_steer, CS.out.steeringTorqueEps, self.params) # >100 degree/sec steering fault prevention self.steer_rate_counter, apply_steer_req = common_fault_avoidance(abs(CS.out.steeringRateDeg) >= MAX_STEER_RATE, lat_active, self.steer_rate_counter, MAX_STEER_RATE_FRAMES) if not lat_active: - apply_torque = 0 + apply_steer = 0 # *** steer angle *** if self.CP.steerControlType == SteerControlType.angle: # If using LTA control, disable LKA and set steering angle command - apply_torque = 0 + apply_steer = 0 apply_steer_req = False if self.frame % 2 == 0: # EPS uses the torque sensor angle to control with, offset to compensate apply_angle = actuators.steeringAngleDeg + CS.out.steeringAngleOffsetDeg # Angular rate limit based on speed - self.last_angle = apply_std_steer_angle_limits(apply_angle, self.last_angle, CS.out.vEgoRaw, - CS.out.steeringAngleDeg + CS.out.steeringAngleOffsetDeg, - CC.latActive, self.params.ANGLE_LIMITS) + apply_angle = apply_std_steer_angle_limits(apply_angle, self.last_angle, CS.out.vEgoRaw, self.params) + + if not lat_active: + apply_angle = CS.out.steeringAngleDeg + CS.out.steeringAngleOffsetDeg + + self.last_angle = float(np.clip(apply_angle, -MAX_LTA_ANGLE, MAX_LTA_ANGLE)) - self.last_torque = apply_torque + self.last_steer = apply_steer # toyota can trace shows STEERING_LKA at 42Hz, with counter adding alternatively 1 and 2; # sending it at 100Hz seem to allow a higher rate limit, as the rate limit seems imposed # on consecutive messages - steer_command = toyotacan.create_steer_command(self.packer, apply_torque, apply_steer_req) + steer_command = toyotacan.create_steer_command(self.packer, apply_steer, apply_steer_req) if self.CP.flags & ToyotaFlags.SECOC.value: # TODO: check if this slow and needs to be done by the CANPacker steer_command = add_mac(self.secoc_key, @@ -146,7 +154,7 @@ def update(self, CC, CS, now_nanos): # cut steering torque with TORQUE_WIND_DOWN when either EPS torque or driver torque is above # the threshold, to limit max lateral acceleration and for driver torque blending respectively. full_torque_condition = (abs(CS.out.steeringTorqueEps) < self.params.STEER_MAX and - abs(CS.out.steeringTorque) < self.params.MAX_LTA_DRIVER_TORQUE_ALLOWANCE) + abs(CS.out.steeringTorque) < MAX_LTA_DRIVER_TORQUE_ALLOWANCE) # TORQUE_WIND_DOWN at 0 ramps down torque at roughly the max down rate of 1500 units/sec torque_wind_down = 100 if lta_active and full_torque_condition else 0 @@ -281,8 +289,8 @@ def update(self, CC, CS, now_nanos): can_sends.append(make_tester_present_msg(0x750, 0, 0xF)) new_actuators = actuators.as_builder() - new_actuators.torque = apply_torque / self.params.STEER_MAX - new_actuators.torqueOutputCan = apply_torque + new_actuators.steer = apply_steer / self.params.STEER_MAX + new_actuators.steerOutputCan = apply_steer new_actuators.steeringAngleDeg = self.last_angle new_actuators.accel = self.accel diff --git a/opendbc/car/toyota/carstate.py b/opendbc/car/toyota/carstate.py index 53f30709d5c..bd68d693a0a 100644 --- a/opendbc/car/toyota/carstate.py +++ b/opendbc/car/toyota/carstate.py @@ -161,8 +161,7 @@ def update(self, can_parsers) -> structs.CarState: # send your own ACC_CONTROL msg on startup with ACC_TYPE set to 1 if (self.CP.carFingerprint not in TSS2_CAR and self.CP.carFingerprint not in UNSUPPORTED_DSU_CAR) or \ (self.CP.carFingerprint in TSS2_CAR and self.acc_type == 1): - if self.CP.openpilotLongitudinalControl: - ret.accFaulted = ret.accFaulted or cp.vl["PCM_CRUISE_2"]["LOW_SPEED_LOCKOUT"] == 2 + ret.accFaulted = ret.accFaulted or cp.vl["PCM_CRUISE_2"]["LOW_SPEED_LOCKOUT"] == 2 self.pcm_acc_status = cp.vl["PCM_CRUISE"]["CRUISE_STATE"] if self.CP.carFingerprint not in (NO_STOP_TIMER_CAR - TSS2_CAR): diff --git a/opendbc/car/toyota/interface.py b/opendbc/car/toyota/interface.py index 46845fb0a95..b3604c59f10 100644 --- a/opendbc/car/toyota/interface.py +++ b/opendbc/car/toyota/interface.py @@ -21,15 +21,15 @@ def _get_params(ret: structs.CarParams, candidate, fingerprint, car_fw, experime # BRAKE_MODULE is on a different address for these cars if DBC[candidate][Bus.pt] == "toyota_new_mc_pt_generated": - ret.safetyConfigs[0].safetyParam |= ToyotaSafetyFlags.ALT_BRAKE.value + ret.safetyConfigs[0].safetyParam |= ToyotaSafetyFlags.FLAG_TOYOTA_ALT_BRAKE.value if ret.flags & ToyotaFlags.SECOC.value: ret.secOcRequired = True - ret.safetyConfigs[0].safetyParam |= ToyotaSafetyFlags.SECOC.value + ret.safetyConfigs[0].safetyParam |= ToyotaSafetyFlags.FLAG_TOYOTA_SECOC.value if candidate in ANGLE_CONTROL_CAR: ret.steerControlType = SteerControlType.angle - ret.safetyConfigs[0].safetyParam |= ToyotaSafetyFlags.LTA.value + ret.safetyConfigs[0].safetyParam |= ToyotaSafetyFlags.FLAG_TOYOTA_LTA.value # LTA control can be more delayed and winds up more often ret.steerActuatorDelay = 0.18 @@ -126,7 +126,7 @@ def _get_params(ret: structs.CarParams, candidate, fingerprint, car_fw, experime ret.autoResumeSng = ret.openpilotLongitudinalControl and candidate in NO_STOP_TIMER_CAR if not ret.openpilotLongitudinalControl: - ret.safetyConfigs[0].safetyParam |= ToyotaSafetyFlags.STOCK_LONGITUDINAL.value + ret.safetyConfigs[0].safetyParam |= ToyotaSafetyFlags.FLAG_TOYOTA_STOCK_LONGITUDINAL.value # min speed to enable ACC. if car can do stop and go, then set enabling speed # to a negative value, so it won't matter. diff --git a/opendbc/car/toyota/values.py b/opendbc/car/toyota/values.py index 889b9d0cb42..89b27534852 100644 --- a/opendbc/car/toyota/values.py +++ b/opendbc/car/toyota/values.py @@ -3,7 +3,7 @@ from dataclasses import dataclass, field from enum import Enum, IntFlag -from opendbc.car import Bus, CarSpecs, PlatformConfig, Platforms, AngleSteeringLimits +from opendbc.car import Bus, CarSpecs, PlatformConfig, Platforms, AngleRateLimit from opendbc.car.common.conversions import Conversions as CV from opendbc.car.structs import CarParams from opendbc.car.docs_definitions import CarFootnote, CarDocs, Column, CarParts, CarHarness @@ -20,19 +20,13 @@ class CarControllerParams: STEER_ERROR_MAX = 350 # max delta between torque cmd and torque motor # Lane Tracing Assist (LTA) control limits - ANGLE_LIMITS: AngleSteeringLimits = AngleSteeringLimits( - # EPS ignores commands above this angle and causes PCS to fault - 94.9461, # deg - # Assuming a steering ratio of 13.7: - # Limit to ~2.0 m/s^3 up (7.5 deg/s), ~3.5 m/s^3 down (13 deg/s) at 75 mph - # Worst case, the low speed limits will allow ~4.0 m/s^3 up (15 deg/s) and ~4.9 m/s^3 down (18 deg/s) at 75 mph, - # however the EPS has its own internal limits at all speeds which are less than that: - # Observed internal torque rate limit on TSS 2.5 Camry and RAV4 is ~1500 units/sec up and down when using LTA - ([5, 25], [0.3, 0.15]), - ([5, 25], [0.36, 0.26]), - ) - - MAX_LTA_DRIVER_TORQUE_ALLOWANCE = 150 # slightly above steering pressed allows some resistance when changing lanes + # Assuming a steering ratio of 13.7: + # Limit to ~2.0 m/s^3 up (7.5 deg/s), ~3.5 m/s^3 down (13 deg/s) at 75 mph + # Worst case, the low speed limits will allow ~4.0 m/s^3 up (15 deg/s) and ~4.9 m/s^3 down (18 deg/s) at 75 mph, + # however the EPS has its own internal limits at all speeds which are less than that: + # Observed internal torque rate limit on TSS 2.5 Camry and RAV4 is ~1500 units/sec up and down when using LTA + ANGLE_RATE_LIMIT_UP = AngleRateLimit(speed_bp=[5, 25], angle_v=[0.3, 0.15]) + ANGLE_RATE_LIMIT_DOWN = AngleRateLimit(speed_bp=[5, 25], angle_v=[0.36, 0.26]) def __init__(self, CP): if CP.flags & ToyotaFlags.RAISED_ACCEL_LIMIT: @@ -51,10 +45,10 @@ def __init__(self, CP): class ToyotaSafetyFlags(IntFlag): # first byte is for EPS scaling factor - ALT_BRAKE = (1 << 8) - STOCK_LONGITUDINAL = (2 << 8) - LTA = (4 << 8) - SECOC = (8 << 8) + FLAG_TOYOTA_ALT_BRAKE = (1 << 8) + FLAG_TOYOTA_STOCK_LONGITUDINAL = (2 << 8) + FLAG_TOYOTA_LTA = (4 << 8) + FLAG_TOYOTA_SECOC = (8 << 8) class ToyotaFlags(IntFlag): diff --git a/opendbc/car/vehicle_model.py b/opendbc/car/vehicle_model.py deleted file mode 100755 index 6aa1ba38bb9..00000000000 --- a/opendbc/car/vehicle_model.py +++ /dev/null @@ -1,230 +0,0 @@ -#!/usr/bin/env python3 -""" -Dynamic bicycle model from "The Science of Vehicle Dynamics (2014), M. Guiggiani" - -The state is x = [v, r]^T -with v lateral speed [m/s], and r rotational speed [rad/s] - -The input u is the steering angle [rad], and roll [rad] - -The system is defined by -x_dot = A*x + B*u - -A depends on longitudinal speed, u [m/s], and vehicle parameters CP -""" - -import numpy as np -from numpy.linalg import solve - -from opendbc.car.structs import CarParams - -ACCELERATION_DUE_TO_GRAVITY = 9.8 - - -class VehicleModel: - def __init__(self, CP: CarParams): - """ - Args: - CP: Car Parameters - """ - # for math readability, convert long names car params into short names - self.m: float = CP.mass - self.j: float = CP.rotationalInertia - self.l: float = CP.wheelbase - self.aF: float = CP.centerToFront - self.aR: float = CP.wheelbase - CP.centerToFront - self.chi: float = CP.steerRatioRear - - self.cF_orig: float = CP.tireStiffnessFront - self.cR_orig: float = CP.tireStiffnessRear - self.update_params(1.0, CP.steerRatio) - - def update_params(self, stiffness_factor: float, steer_ratio: float) -> None: - """Update the vehicle model with a new stiffness factor and steer ratio""" - self.cF: float = stiffness_factor * self.cF_orig - self.cR: float = stiffness_factor * self.cR_orig - self.sR: float = steer_ratio - - def steady_state_sol(self, sa: float, u: float, roll: float) -> np.ndarray: - """Returns the steady state solution. - - If the speed is too low we can't use the dynamic model (tire slip is undefined), - we then have to use the kinematic model - - Args: - sa: Steering wheel angle [rad] - u: Speed [m/s] - roll: Road Roll [rad] - - Returns: - 2x1 matrix with steady state solution (lateral speed, rotational speed) - """ - if u > 0.1: - return dyn_ss_sol(sa, u, roll, self) - else: - return kin_ss_sol(sa, u, self) - - def calc_curvature(self, sa: float, u: float, roll: float) -> float: - """Returns the curvature. Multiplied by the speed this will give the yaw rate. - - Args: - sa: Steering wheel angle [rad] - u: Speed [m/s] - roll: Road Roll [rad] - - Returns: - Curvature factor [1/m] - """ - return (self.curvature_factor(u) * sa / self.sR) + self.roll_compensation(roll, u) - - def curvature_factor(self, u: float) -> float: - """Returns the curvature factor. - Multiplied by wheel angle (not steering wheel angle) this will give the curvature. - - Args: - u: Speed [m/s] - - Returns: - Curvature factor [1/m] - """ - sf = calc_slip_factor(self) - return (1. - self.chi) / (1. - sf * u**2) / self.l - - def get_steer_from_curvature(self, curv: float, u: float, roll: float) -> float: - """Calculates the required steering wheel angle for a given curvature - - Args: - curv: Desired curvature [1/m] - u: Speed [m/s] - roll: Road Roll [rad] - - Returns: - Steering wheel angle [rad] - """ - - return (curv - self.roll_compensation(roll, u)) * self.sR * 1.0 / self.curvature_factor(u) - - def roll_compensation(self, roll: float, u: float) -> float: - """Calculates the roll-compensation to curvature - - Args: - roll: Road Roll [rad] - u: Speed [m/s] - - Returns: - Roll compensation curvature [rad] - """ - sf = calc_slip_factor(self) - - if abs(sf) < 1e-6: - return 0 - else: - return (ACCELERATION_DUE_TO_GRAVITY * roll) / ((1 / sf) - u**2) - - def get_steer_from_yaw_rate(self, yaw_rate: float, u: float, roll: float) -> float: - """Calculates the required steering wheel angle for a given yaw_rate - - Args: - yaw_rate: Desired yaw rate [rad/s] - u: Speed [m/s] - roll: Road Roll [rad] - - Returns: - Steering wheel angle [rad] - """ - curv = yaw_rate / u - return self.get_steer_from_curvature(curv, u, roll) - - def yaw_rate(self, sa: float, u: float, roll: float) -> float: - """Calculate yaw rate - - Args: - sa: Steering wheel angle [rad] - u: Speed [m/s] - roll: Road Roll [rad] - - Returns: - Yaw rate [rad/s] - """ - return self.calc_curvature(sa, u, roll) * u - - -def kin_ss_sol(sa: float, u: float, VM: VehicleModel) -> np.ndarray: - """Calculate the steady state solution at low speeds - At low speeds the tire slip is undefined, so a kinematic - model is used. - - Args: - sa: Steering angle [rad] - u: Speed [m/s] - VM: Vehicle model - - Returns: - 2x1 matrix with steady state solution - """ - K = np.zeros((2, 1)) - K[0, 0] = VM.aR / VM.sR / VM.l * u - K[1, 0] = 1. / VM.sR / VM.l * u - return K * sa - - -def create_dyn_state_matrices(u: float, VM: VehicleModel) -> tuple[np.ndarray, np.ndarray]: - """Returns the A and B matrix for the dynamics system - - Args: - u: Vehicle speed [m/s] - VM: Vehicle model - - Returns: - A tuple with the 2x2 A matrix, and 2x2 B matrix - - Parameters in the vehicle model: - cF: Tire stiffness Front [N/rad] - cR: Tire stiffness Front [N/rad] - aF: Distance from CG to front wheels [m] - aR: Distance from CG to rear wheels [m] - m: Mass [kg] - j: Rotational inertia [kg m^2] - sR: Steering ratio [-] - chi: Steer ratio rear [-] - """ - A = np.zeros((2, 2)) - B = np.zeros((2, 2)) - A[0, 0] = - (VM.cF + VM.cR) / (VM.m * u) - A[0, 1] = - (VM.cF * VM.aF - VM.cR * VM.aR) / (VM.m * u) - u - A[1, 0] = - (VM.cF * VM.aF - VM.cR * VM.aR) / (VM.j * u) - A[1, 1] = - (VM.cF * VM.aF**2 + VM.cR * VM.aR**2) / (VM.j * u) - - # Steering input - B[0, 0] = (VM.cF + VM.chi * VM.cR) / VM.m / VM.sR - B[1, 0] = (VM.cF * VM.aF - VM.chi * VM.cR * VM.aR) / VM.j / VM.sR - - # Roll input - B[0, 1] = -ACCELERATION_DUE_TO_GRAVITY - - return A, B - - -def dyn_ss_sol(sa: float, u: float, roll: float, VM: VehicleModel) -> np.ndarray: - """Calculate the steady state solution when x_dot = 0, - Ax + Bu = 0 => x = -A^{-1} B u - - Args: - sa: Steering angle [rad] - u: Speed [m/s] - roll: Road Roll [rad] - VM: Vehicle model - - Returns: - 2x1 matrix with steady state solution - """ - A, B = create_dyn_state_matrices(u, VM) - inp = np.array([[sa], [roll]]) - return -solve(A, B) @ inp # type: ignore - - -def calc_slip_factor(VM: VehicleModel) -> float: - """The slip factor is a measure of how the curvature changes with speed - it's positive for Oversteering vehicle, negative (usual case) otherwise. - """ - return VM.m * (VM.cF * VM.aF - VM.cR * VM.aR) / (VM.l**2 * VM.cF * VM.cR) diff --git a/opendbc/car/vin.py b/opendbc/car/vin.py index e373c76665a..61997be4917 100644 --- a/opendbc/car/vin.py +++ b/opendbc/car/vin.py @@ -1,5 +1,4 @@ import re -from dataclasses import dataclass, field from opendbc.car import uds from opendbc.car.carlog import carlog @@ -10,21 +9,6 @@ VIN_RE = "[A-HJ-NPR-Z0-9]{17}" -@dataclass -class Vin: - vin: str - wmi: str = field(init=False) - vds: str = field(init=False) - vis: str = field(init=False) - - def __post_init__(self): - # parses VIN in accordance with North America standard >2000 vehicles: - # https://en.wikipedia.org/wiki/Vehicle_identification_number#Components - self.wmi = self.vin[:3] # World Manufacturer Identifier - self.vds = self.vin[3:9] # Vehicle Descriptor Section - self.vis = self.vin[9:17] # Vehicle Identifier Section - - def is_valid_vin(vin: str): return re.fullmatch(VIN_RE, vin) is not None diff --git a/opendbc/car/volkswagen/carcontroller.py b/opendbc/car/volkswagen/carcontroller.py index e2a4fe86d50..cc0385aa0d9 100644 --- a/opendbc/car/volkswagen/carcontroller.py +++ b/opendbc/car/volkswagen/carcontroller.py @@ -17,9 +17,8 @@ def __init__(self, dbc_names, CP): self.CCS = pqcan if CP.flags & VolkswagenFlags.PQ else mqbcan self.packer_pt = CANPacker(dbc_names[Bus.pt]) self.ext_bus = CANBUS.pt if CP.networkLocation == structs.CarParams.NetworkLocation.fwdCamera else CANBUS.cam - self.aeb_available = not CP.flags & VolkswagenFlags.PQ - self.apply_torque_last = 0 + self.apply_steer_last = 0 self.gra_acc_counter_last = None self.eps_timer_soft_disable_alert = False self.hca_frame_timer_running = 0 @@ -43,53 +42,46 @@ def update(self, CC, CS, now_nanos): # of HCA disabled; this is done whenever output happens to be zero. if CC.latActive: - new_torque = int(round(actuators.torque * self.CCP.STEER_MAX)) - apply_torque = apply_driver_steer_torque_limits(new_torque, self.apply_torque_last, CS.out.steeringTorque, self.CCP) + new_steer = int(round(actuators.steer * self.CCP.STEER_MAX)) + apply_steer = apply_driver_steer_torque_limits(new_steer, self.apply_steer_last, CS.out.steeringTorque, self.CCP) self.hca_frame_timer_running += self.CCP.STEER_STEP - if self.apply_torque_last == apply_torque: + if self.apply_steer_last == apply_steer: self.hca_frame_same_torque += self.CCP.STEER_STEP if self.hca_frame_same_torque > self.CCP.STEER_TIME_STUCK_TORQUE / DT_CTRL: - apply_torque -= (1, -1)[apply_torque < 0] + apply_steer -= (1, -1)[apply_steer < 0] self.hca_frame_same_torque = 0 else: self.hca_frame_same_torque = 0 - hca_enabled = abs(apply_torque) > 0 + hca_enabled = abs(apply_steer) > 0 else: hca_enabled = False - apply_torque = 0 + apply_steer = 0 if not hca_enabled: self.hca_frame_timer_running = 0 self.eps_timer_soft_disable_alert = self.hca_frame_timer_running > self.CCP.STEER_TIME_ALERT / DT_CTRL - self.apply_torque_last = apply_torque - can_sends.append(self.CCS.create_steering_control(self.packer_pt, CANBUS.pt, apply_torque, hca_enabled)) + self.apply_steer_last = apply_steer + can_sends.append(self.CCS.create_steering_control(self.packer_pt, CANBUS.pt, apply_steer, hca_enabled)) if self.CP.flags & VolkswagenFlags.STOCK_HCA_PRESENT: # Pacify VW Emergency Assist driver inactivity detection by changing its view of driver steering input torque # to the greatest of actual driver input or 2x openpilot's output (1x openpilot output is not enough to # consistently reset inactivity detection on straight level roads). See commaai/openpilot#23274 for background. - ea_simulated_torque = float(np.clip(apply_torque * 2, -self.CCP.STEER_MAX, self.CCP.STEER_MAX)) + ea_simulated_torque = float(np.clip(apply_steer * 2, -self.CCP.STEER_MAX, self.CCP.STEER_MAX)) if abs(CS.out.steeringTorque) > abs(ea_simulated_torque): ea_simulated_torque = CS.out.steeringTorque can_sends.append(self.CCS.create_eps_update(self.packer_pt, CANBUS.cam, CS.eps_stock_values, ea_simulated_torque)) # **** Acceleration Controls ******************************************** # - if self.CP.openpilotLongitudinalControl: - if self.frame % self.CCP.ACC_CONTROL_STEP == 0: - acc_control = self.CCS.acc_control_value(CS.out.cruiseState.available, CS.out.accFaulted, CC.longActive) - accel = float(np.clip(actuators.accel, self.CCP.ACCEL_MIN, self.CCP.ACCEL_MAX) if CC.longActive else 0) - stopping = actuators.longControlState == LongCtrlState.stopping - starting = actuators.longControlState == LongCtrlState.pid and (CS.esp_hold_confirmation or CS.out.vEgo < self.CP.vEgoStopping) - can_sends.extend(self.CCS.create_acc_accel_control(self.packer_pt, CANBUS.pt, CS.acc_type, CC.longActive, accel, - acc_control, stopping, starting, CS.esp_hold_confirmation)) - - #if self.aeb_available: - # if self.frame % self.CCP.AEB_CONTROL_STEP == 0: - # can_sends.append(self.CCS.create_aeb_control(self.packer_pt, False, False, 0.0)) - # if self.frame % self.CCP.AEB_HUD_STEP == 0: - # can_sends.append(self.CCS.create_aeb_hud(self.packer_pt, False, False)) + if self.frame % self.CCP.ACC_CONTROL_STEP == 0 and self.CP.openpilotLongitudinalControl: + acc_control = self.CCS.acc_control_value(CS.out.cruiseState.available, CS.out.accFaulted, CC.longActive) + accel = float(np.clip(actuators.accel, self.CCP.ACCEL_MIN, self.CCP.ACCEL_MAX) if CC.longActive else 0) + stopping = actuators.longControlState == LongCtrlState.stopping + starting = actuators.longControlState == LongCtrlState.pid and (CS.esp_hold_confirmation or CS.out.vEgo < self.CP.vEgoStopping) + can_sends.extend(self.CCS.create_acc_accel_control(self.packer_pt, CANBUS.pt, CS.acc_type, CC.longActive, accel, + acc_control, stopping, starting, CS.esp_hold_confirmation)) # **** HUD Controls ***************************************************** # @@ -118,8 +110,8 @@ def update(self, CC, CS, now_nanos): cancel=CC.cruiseControl.cancel, resume=CC.cruiseControl.resume)) new_actuators = actuators.as_builder() - new_actuators.torque = self.apply_torque_last / self.CCP.STEER_MAX - new_actuators.torqueOutputCan = self.apply_torque_last + new_actuators.steer = self.apply_steer_last / self.CCP.STEER_MAX + new_actuators.steerOutputCan = self.apply_steer_last self.gra_acc_counter_last = CS.gra_stock_values["COUNTER"] self.frame += 1 diff --git a/opendbc/car/volkswagen/carstate.py b/opendbc/car/volkswagen/carstate.py index 2e346222188..d216dfc9409 100644 --- a/opendbc/car/volkswagen/carstate.py +++ b/opendbc/car/volkswagen/carstate.py @@ -51,96 +51,120 @@ def update(self, can_parsers) -> structs.CarState: return self.update_pq(pt_cp, cam_cp, ext_cp) ret = structs.CarState() - - if self.CP.transmissionType == TransmissionType.direct: - ret.gearShifter = self.parse_gear_shifter(self.CCP.shifter_values.get(pt_cp.vl["Motor_EV_01"]["MO_Waehlpos"], None)) - elif self.CP.transmissionType == TransmissionType.manual: - ret.clutchPressed = not pt_cp.vl["Motor_14"]["MO_Kuppl_schalter"] - if bool(pt_cp.vl["Gateway_72"]["BCM1_Rueckfahrlicht_Schalter"]): - ret.gearShifter = GearShifter.reverse - else: - ret.gearShifter = GearShifter.drive - else: - ret.gearShifter = self.parse_gear_shifter(self.CCP.shifter_values.get(pt_cp.vl["Gateway_73"]["GE_Fahrstufe"], None)) - - if True: - # MQB-specific - self.upscale_lead_car_signal = bool(pt_cp.vl["Kombi_03"]["KBI_Variante"]) # Analog vs digital instrument cluster - - ret.wheelSpeeds = self.get_wheel_speeds( - pt_cp.vl["ESP_19"]["ESP_VL_Radgeschw_02"], - pt_cp.vl["ESP_19"]["ESP_VR_Radgeschw_02"], - pt_cp.vl["ESP_19"]["ESP_HL_Radgeschw_02"], - pt_cp.vl["ESP_19"]["ESP_HR_Radgeschw_02"], - ) - - ret.yawRate = pt_cp.vl["ESP_02"]["ESP_Gierrate"] * (1, -1)[int(pt_cp.vl["ESP_02"]["ESP_VZ_Gierrate"])] * CV.DEG_TO_RAD - hca_status = self.CCP.hca_status_values.get(pt_cp.vl["LH_EPS_03"]["EPS_HCA_Status"]) - if self.CP.flags & VolkswagenFlags.STOCK_HCA_PRESENT: - ret.carFaultedNonCritical = bool(cam_cp.vl["HCA_01"]["EA_Ruckfreigabe"]) or cam_cp.vl["HCA_01"]["EA_ACC_Sollstatus"] > 0 # EA - - drive_mode = True - ret.gas = pt_cp.vl["Motor_20"]["MO_Fahrpedalrohwert_01"] / 100.0 - ret.brake = pt_cp.vl["ESP_05"]["ESP_Bremsdruck"] / 250.0 # FIXME: this is pressure in Bar, not sure what OP expects - brake_pedal_pressed = bool(pt_cp.vl["Motor_14"]["MO_Fahrer_bremst"]) - brake_pressure_detected = bool(pt_cp.vl["ESP_05"]["ESP_Fahrer_bremst"]) - ret.brakePressed = brake_pedal_pressed or brake_pressure_detected - ret.parkingBrake = bool(pt_cp.vl["Kombi_01"]["KBI_Handbremse"]) # FIXME: need to include an EPB check as well - - ret.doorOpen = any([pt_cp.vl["Gateway_72"]["ZV_FT_offen"], - pt_cp.vl["Gateway_72"]["ZV_BT_offen"], - pt_cp.vl["Gateway_72"]["ZV_HFS_offen"], - pt_cp.vl["Gateway_72"]["ZV_HBFS_offen"], - pt_cp.vl["Gateway_72"]["ZV_HD_offen"]]) - - if self.CP.enableBsm: - # Infostufe: BSM LED on, Warnung: BSM LED flashing - ret.leftBlindspot = bool(ext_cp.vl["SWA_01"]["SWA_Infostufe_SWA_li"]) or bool(ext_cp.vl["SWA_01"]["SWA_Warnung_SWA_li"]) - ret.rightBlindspot = bool(ext_cp.vl["SWA_01"]["SWA_Infostufe_SWA_re"]) or bool(ext_cp.vl["SWA_01"]["SWA_Warnung_SWA_re"]) - - ret.stockFcw = bool(ext_cp.vl["ACC_10"]["AWV2_Freigabe"]) - ret.stockAeb = bool(ext_cp.vl["ACC_10"]["ANB_Teilbremsung_Freigabe"]) or bool(ext_cp.vl["ACC_10"]["ANB_Zielbremsung_Freigabe"]) - - self.acc_type = ext_cp.vl["ACC_06"]["ACC_Typ"] - self.esp_hold_confirmation = bool(pt_cp.vl["ESP_21"]["ESP_Haltebestaetigung"]) - acc_limiter_mode = ext_cp.vl["ACC_02"]["ACC_Gesetzte_Zeitluecke"] == 0 - speed_limiter_mode = bool(pt_cp.vl["TSK_06"]["TSK_Limiter_ausgewaehlt"]) - - ret.cruiseState.available = pt_cp.vl["TSK_06"]["TSK_Status"] in (2, 3, 4, 5) - ret.cruiseState.enabled = pt_cp.vl["TSK_06"]["TSK_Status"] in (3, 4, 5) - ret.cruiseState.speed = ext_cp.vl["ACC_02"]["ACC_Wunschgeschw_02"] * CV.KPH_TO_MS if self.CP.pcmCruise else 0 - ret.accFaulted = pt_cp.vl["TSK_06"]["TSK_Status"] in (6, 7) - - ret.leftBlinker = bool(pt_cp.vl["Blinkmodi_02"]["Comfort_Signal_Left"]) - ret.rightBlinker = bool(pt_cp.vl["Blinkmodi_02"]["Comfort_Signal_Right"]) - - # Shared logic + # Update vehicle speed and acceleration from ABS wheel speeds. + ret.wheelSpeeds = self.get_wheel_speeds( + pt_cp.vl["ESP_19"]["ESP_VL_Radgeschw_02"], + pt_cp.vl["ESP_19"]["ESP_VR_Radgeschw_02"], + pt_cp.vl["ESP_19"]["ESP_HL_Radgeschw_02"], + pt_cp.vl["ESP_19"]["ESP_HR_Radgeschw_02"], + ) ret.vEgoRaw = float(np.mean([ret.wheelSpeeds.fl, ret.wheelSpeeds.fr, ret.wheelSpeeds.rl, ret.wheelSpeeds.rr])) ret.vEgo, ret.aEgo = self.update_speed_kf(ret.vEgoRaw) + ret.standstill = ret.vEgoRaw == 0 + # Update EPS position and state info. For signed values, VW sends the sign in a separate signal. ret.steeringAngleDeg = pt_cp.vl["LWI_01"]["LWI_Lenkradwinkel"] * (1, -1)[int(pt_cp.vl["LWI_01"]["LWI_VZ_Lenkradwinkel"])] ret.steeringRateDeg = pt_cp.vl["LWI_01"]["LWI_Lenkradw_Geschw"] * (1, -1)[int(pt_cp.vl["LWI_01"]["LWI_VZ_Lenkradw_Geschw"])] ret.steeringTorque = pt_cp.vl["LH_EPS_03"]["EPS_Lenkmoment"] * (1, -1)[int(pt_cp.vl["LH_EPS_03"]["EPS_VZ_Lenkmoment"])] ret.steeringPressed = abs(ret.steeringTorque) > self.CCP.STEER_DRIVER_ALLOWANCE - ret.steerFaultTemporary, ret.steerFaultPermanent = self.update_hca_state(hca_status, drive_mode) + ret.yawRate = pt_cp.vl["ESP_02"]["ESP_Gierrate"] * (1, -1)[int(pt_cp.vl["ESP_02"]["ESP_VZ_Gierrate"])] * CV.DEG_TO_RAD + hca_status = self.CCP.hca_status_values.get(pt_cp.vl["LH_EPS_03"]["EPS_HCA_Status"]) + ret.steerFaultTemporary, ret.steerFaultPermanent = self.update_hca_state(hca_status) + + # VW Emergency Assist status tracking and mitigation + self.eps_stock_values = pt_cp.vl["LH_EPS_03"] + if self.CP.flags & VolkswagenFlags.STOCK_HCA_PRESENT: + ret.carFaultedNonCritical = bool(cam_cp.vl["HCA_01"]["EA_Ruckfreigabe"]) or cam_cp.vl["HCA_01"]["EA_ACC_Sollstatus"] > 0 + # Update gas, brakes, and gearshift. + ret.gas = pt_cp.vl["Motor_20"]["MO_Fahrpedalrohwert_01"] / 100.0 ret.gasPressed = ret.gas > 0 - ret.espActive = bool(pt_cp.vl["ESP_21"]["ESP_Eingriff"]) - ret.espDisabled = pt_cp.vl["ESP_21"]["ESP_Tastung_passiv"] != 0 + ret.brake = pt_cp.vl["ESP_05"]["ESP_Bremsdruck"] / 250.0 # FIXME: this is pressure in Bar, not sure what OP expects + brake_pedal_pressed = bool(pt_cp.vl["Motor_14"]["MO_Fahrer_bremst"]) + brake_pressure_detected = bool(pt_cp.vl["ESP_05"]["ESP_Fahrer_bremst"]) + ret.brakePressed = brake_pedal_pressed or brake_pressure_detected + ret.parkingBrake = bool(pt_cp.vl["Kombi_01"]["KBI_Handbremse"]) # FIXME: need to include an EPB check as well + + # Update gear and/or clutch position data. + if self.CP.transmissionType == TransmissionType.automatic: + ret.gearShifter = self.parse_gear_shifter(self.CCP.shifter_values.get(pt_cp.vl["Getriebe_11"]["GE_Fahrstufe"], None)) + elif self.CP.transmissionType == TransmissionType.direct: + ret.gearShifter = self.parse_gear_shifter(self.CCP.shifter_values.get(pt_cp.vl["Motor_EV_01"]["MO_Waehlpos"], None)) + elif self.CP.transmissionType == TransmissionType.manual: + ret.clutchPressed = not pt_cp.vl["Motor_14"]["MO_Kuppl_schalter"] + if bool(pt_cp.vl["Gateway_72"]["BCM1_Rueckfahrlicht_Schalter"]): + ret.gearShifter = GearShifter.reverse + else: + ret.gearShifter = GearShifter.drive + + # Update door and trunk/hatch lid open status. + ret.doorOpen = any([pt_cp.vl["Gateway_72"]["ZV_FT_offen"], + pt_cp.vl["Gateway_72"]["ZV_BT_offen"], + pt_cp.vl["Gateway_72"]["ZV_HFS_offen"], + pt_cp.vl["Gateway_72"]["ZV_HBFS_offen"], + pt_cp.vl["Gateway_72"]["ZV_HD_offen"]]) + + # Update seatbelt fastened status. ret.seatbeltUnlatched = pt_cp.vl["Airbag_02"]["AB_Gurtschloss_FA"] != 3 - ret.standstill = ret.vEgoRaw == 0 - ret.cruiseState.standstill = self.CP.pcmCruise and self.esp_hold_confirmation - ret.cruiseState.nonAdaptive = acc_limiter_mode or speed_limiter_mode - if ret.cruiseState.speed > 90: - ret.cruiseState.speed = 0 + # Consume blind-spot monitoring info/warning LED states, if available. + # Infostufe: BSM LED on, Warnung: BSM LED flashing + if self.CP.enableBsm: + ret.leftBlindspot = bool(ext_cp.vl["SWA_01"]["SWA_Infostufe_SWA_li"]) or bool(ext_cp.vl["SWA_01"]["SWA_Warnung_SWA_li"]) + ret.rightBlindspot = bool(ext_cp.vl["SWA_01"]["SWA_Infostufe_SWA_re"]) or bool(ext_cp.vl["SWA_01"]["SWA_Warnung_SWA_re"]) - self.eps_stock_values = pt_cp.vl["LH_EPS_03"] + # Consume factory LDW data relevant for factory SWA (Lane Change Assist) + # and capture it for forwarding to the blind spot radar controller self.ldw_stock_values = cam_cp.vl["LDW_02"] if self.CP.networkLocation == NetworkLocation.fwdCamera else {} - self.gra_stock_values = pt_cp.vl["GRA_ACC_01"] + # Stock FCW is considered active if the release bit for brake-jerk warning + # is set. Stock AEB considered active if the partial braking or target + # braking release bits are set. + # Refer to VW Self Study Program 890253: Volkswagen Driver Assistance + # Systems, chapter on Front Assist with Braking: Golf Family for all MQB + ret.stockFcw = bool(ext_cp.vl["ACC_10"]["AWV2_Freigabe"]) + ret.stockAeb = bool(ext_cp.vl["ACC_10"]["ANB_Teilbremsung_Freigabe"]) or bool(ext_cp.vl["ACC_10"]["ANB_Zielbremsung_Freigabe"]) + + # Update ACC radar status. + self.acc_type = ext_cp.vl["ACC_06"]["ACC_Typ"] + + # ACC okay but disabled (1), ACC ready (2), a radar visibility or other fault/disruption (6 or 7) + # currently regulating speed (3), driver accel override (4), brake only (5) + ret.cruiseState.available = pt_cp.vl["TSK_06"]["TSK_Status"] in (2, 3, 4, 5) + ret.cruiseState.enabled = pt_cp.vl["TSK_06"]["TSK_Status"] in (3, 4, 5) + + if self.CP.pcmCruise: + # Cruise Control mode; check for distance UI setting from the radar. + # ECM does not manage this, so do not need to check for openpilot longitudinal + ret.cruiseState.nonAdaptive = ext_cp.vl["ACC_02"]["ACC_Gesetzte_Zeitluecke"] == 0 + else: + # Speed limiter mode; ECM faults if we command ACC while not pcmCruise + ret.cruiseState.nonAdaptive = bool(pt_cp.vl["TSK_06"]["TSK_Limiter_ausgewaehlt"]) + + ret.accFaulted = pt_cp.vl["TSK_06"]["TSK_Status"] in (6, 7) + + self.esp_hold_confirmation = bool(pt_cp.vl["ESP_21"]["ESP_Haltebestaetigung"]) + ret.cruiseState.standstill = self.CP.pcmCruise and self.esp_hold_confirmation + + # Update ACC setpoint. When the setpoint is zero or there's an error, the + # radar sends a set-speed of ~90.69 m/s / 203mph. + if self.CP.pcmCruise: + ret.cruiseState.speed = ext_cp.vl["ACC_02"]["ACC_Wunschgeschw_02"] * CV.KPH_TO_MS + if ret.cruiseState.speed > 90: + ret.cruiseState.speed = 0 + + # Update button states for turn signals and ACC controls, capture all ACC button state/config for passthrough + ret.leftBlinker = bool(pt_cp.vl["Blinkmodi_02"]["Comfort_Signal_Left"]) + ret.rightBlinker = bool(pt_cp.vl["Blinkmodi_02"]["Comfort_Signal_Right"]) ret.buttonEvents = self.create_button_events(pt_cp, self.CCP.BUTTONS) + self.gra_stock_values = pt_cp.vl["GRA_ACC_01"] + + # Additional safety checks performed in CarInterface. + ret.espDisabled = pt_cp.vl["ESP_21"]["ESP_Tastung_passiv"] != 0 + + # Digital instrument clusters expect the ACC HUD lead car distance to be scaled differently + self.upscale_lead_car_signal = bool(pt_cp.vl["Kombi_03"]["KBI_Variante"]) self.frame += 1 return ret @@ -244,12 +268,12 @@ def update_pq(self, pt_cp, cam_cp, ext_cp) -> structs.CarState: self.frame += 1 return ret - def update_hca_state(self, hca_status, drive_mode=True): + def update_hca_state(self, hca_status): # Treat FAULT as temporary for worst likely EPS recovery time, for cars without factory Lane Assist # DISABLED means the EPS hasn't been configured to support Lane Assist self.eps_init_complete = self.eps_init_complete or (hca_status in ("DISABLED", "READY", "ACTIVE") or self.frame > 600) - perm_fault = drive_mode and hca_status == "DISABLED" or (self.eps_init_complete and hca_status == "FAULT") - temp_fault = drive_mode and hca_status in ("REJECTED", "PREEMPTED") or not self.eps_init_complete + perm_fault = hca_status == "DISABLED" or (self.eps_init_complete and hca_status == "FAULT") + temp_fault = hca_status in ("REJECTED", "PREEMPTED") or not self.eps_init_complete return temp_fault, perm_fault @staticmethod @@ -268,7 +292,6 @@ def get_can_parsers(CP): ("TSK_06", 50), # From J623 Engine control module ("ESP_02", 50), # From J104 ABS/ESP controller ("GRA_ACC_01", 33), # From J533 CAN gateway (via LIN from steering wheel controls) - ("Gateway_73", 20), # From J533 CAN gateway (aggregated data) ("Gateway_72", 10), # From J533 CAN gateway (aggregated data) ("Motor_14", 10), # From J623 Engine control module ("Airbag_02", 5), # From J234 Airbag control module @@ -277,7 +300,9 @@ def get_can_parsers(CP): ("Kombi_03", 0), # From J285 instrument cluster (not present on older cars, 1Hz when present) ] - if CP.transmissionType == TransmissionType.direct: + if CP.transmissionType == TransmissionType.automatic: + pt_messages.append(("Getriebe_11", 20)) # From J743 Auto transmission control module + elif CP.transmissionType == TransmissionType.direct: pt_messages.append(("Motor_EV_01", 10)) # From J??? unknown EV control module if CP.networkLocation == NetworkLocation.fwdCamera: diff --git a/opendbc/car/volkswagen/fingerprints.py b/opendbc/car/volkswagen/fingerprints.py index 1162e3f9455..ea21987e963 100644 --- a/opendbc/car/volkswagen/fingerprints.py +++ b/opendbc/car/volkswagen/fingerprints.py @@ -352,11 +352,9 @@ CAR.VOLKSWAGEN_JETTA_MK6: { (Ecu.srs, 0x715, None): [ b'\xf1\x875C0959655M \xf1\x890726\xf1\x82\t00NB1108--------24', - b'\xf1\x875K0959655H \xf1\x890724\xf1\x82\t00131108--------02', ], (Ecu.fwdRadar, 0x757, None): [ b'\xf1\x877N0907572C \xf1\x890211\xf1\x82\x0151', - b'\xf1\x877N0907572C \xf1\x890211\xf1\x82\x0152', ], }, CAR.VOLKSWAGEN_JETTA_MK7: { diff --git a/opendbc/car/volkswagen/interface.py b/opendbc/car/volkswagen/interface.py index 6723b12fb4f..2cd81304781 100644 --- a/opendbc/car/volkswagen/interface.py +++ b/opendbc/car/volkswagen/interface.py @@ -72,7 +72,7 @@ def _get_params(ret: structs.CarParams, candidate: CAR, fingerprint, car_fw, exp if experimental_long: # Proof-of-concept, prep for E2E only. No radar points available. Panda ALLOW_DEBUG firmware required. ret.openpilotLongitudinalControl = True - ret.safetyConfigs[0].safetyParam |= VolkswagenSafetyFlags.LONG_CONTROL.value + ret.safetyConfigs[0].safetyParam |= VolkswagenSafetyFlags.FLAG_VOLKSWAGEN_LONG_CONTROL.value if ret.transmissionType == TransmissionType.manual: ret.minEnableSpeed = 4.5 diff --git a/opendbc/car/volkswagen/mqbcan.py b/opendbc/car/volkswagen/mqbcan.py index 4823d19bd9d..763908b6b27 100644 --- a/opendbc/car/volkswagen/mqbcan.py +++ b/opendbc/car/volkswagen/mqbcan.py @@ -1,8 +1,8 @@ -def create_steering_control(packer, bus, apply_torque, lkas_enabled): +def create_steering_control(packer, bus, apply_steer, lkas_enabled): values = { "HCA_01_Status_HCA": 5 if lkas_enabled else 3, - "HCA_01_LM_Offset": abs(apply_torque), - "HCA_01_LM_OffSign": 1 if apply_torque < 0 else 0, + "HCA_01_LM_Offset": abs(apply_steer), + "HCA_01_LM_OffSign": 1 if apply_steer < 0 else 0, "HCA_01_Vib_Freq": 18, "HCA_01_Sendestatus": 1 if lkas_enabled else 0, "EA_ACC_Wunschgeschwindigkeit": 327.36, @@ -135,35 +135,3 @@ def create_acc_hud_control(packer, bus, acc_hud_status, set_speed, lead_distance } return packer.make_can_msg("ACC_02", bus, values) - - -# AWV = Stopping Distance Reduction -# Refer to Self Study Program 890253: Volkswagen Driver Assistance Systems, Design and Function - - -def create_aeb_control(packer, fcw_active, aeb_active, accel): - values = { - "AWV_Vorstufe": 0, # Preliminary stage - "AWV1_Anf_Prefill": 0, # Brake pre-fill request - "AWV1_HBA_Param": 0, # Brake pre-fill level - "AWV2_Freigabe": 0, # Stage 2 braking release - "AWV2_Ruckprofil": 0, # Brake jerk level - "AWV2_Priowarnung": 0, # Suppress lane departure warning in favor of FCW - "ANB_Notfallblinken": 0, # Hazard flashers request - "ANB_Teilbremsung_Freigabe": 0, # Target braking release - "ANB_Zielbremsung_Freigabe": 0, # Partial braking release - "ANB_Zielbrems_Teilbrems_Verz_Anf": 0.0, # Acceleration requirement for target/partial braking, m/s/s - "AWV_Halten": 0, # Vehicle standstill request - "PCF_Time_to_collision": 0xFF, # Pre Crash Front, populated only with a target, might be used on Audi only - } - - return packer.make_can_msg("ACC_10", 0, values) - - -def create_aeb_hud(packer, aeb_supported, fcw_active): - values = { - "AWV_Texte": 5 if aeb_supported else 7, # FCW/AEB system status, display text (from menu in VAL) - "AWV_Status_Anzeige": 1 if aeb_supported else 2, # FCW/AEB system status, available or disabled - } - - return packer.make_can_msg("ACC_15", 0, values) diff --git a/opendbc/car/volkswagen/pqcan.py b/opendbc/car/volkswagen/pqcan.py index a2f8a8b9623..f8d161b9701 100644 --- a/opendbc/car/volkswagen/pqcan.py +++ b/opendbc/car/volkswagen/pqcan.py @@ -1,8 +1,8 @@ -def create_steering_control(packer, bus, apply_torque, lkas_enabled): +def create_steering_control(packer, bus, apply_steer, lkas_enabled): values = { - "LM_Offset": abs(apply_torque), - "LM_OffSign": 1 if apply_torque < 0 else 0, - "HCA_Status": 5 if (lkas_enabled and apply_torque != 0) else 3, + "LM_Offset": abs(apply_steer), + "LM_OffSign": 1 if apply_steer < 0 else 0, + "HCA_Status": 5 if (lkas_enabled and apply_steer != 0) else 3, "Vib_Freq": 16, } diff --git a/opendbc/car/volkswagen/values.py b/opendbc/car/volkswagen/values.py index 750a99e1c67..ea231ee9b87 100644 --- a/opendbc/car/volkswagen/values.py +++ b/opendbc/car/volkswagen/values.py @@ -2,13 +2,13 @@ from dataclasses import dataclass, field from enum import Enum, IntFlag, StrEnum -from opendbc.car import Bus, CarSpecs, DbcDict, PlatformConfig, Platforms, structs, uds +from opendbc.car import Bus, CarSpecs, DbcDict, PlatformConfig, Platforms, uds from opendbc.can.can_define import CANDefine from opendbc.car.common.conversions import Conversions as CV +from opendbc.car import structs from opendbc.car.docs_definitions import CarFootnote, CarHarness, CarDocs, CarParts, Column, \ Device from opendbc.car.fw_query_definitions import EcuAddrSubAddr, FwQueryConfig, Request, p16 -from opendbc.car.vin import Vin Ecu = structs.CarParams.Ecu NetworkLocation = structs.CarParams.NetworkLocation @@ -20,8 +20,6 @@ class CarControllerParams: STEER_STEP = 2 # HCA_01/HCA_1 message frequency 50Hz ACC_CONTROL_STEP = 2 # ACC_06/ACC_07/ACC_System frequency 50Hz - AEB_CONTROL_STEP = 2 # ACC_10 frequency 50Hz - AEB_HUD_STEP = 20 # ACC_15 frequency 5Hz # Documented lateral limits: 3.00 Nm max, rate of change 5.00 Nm/sec. # MQB vs PQ maximums are shared, but rate-of-change limited differently @@ -80,7 +78,7 @@ def __init__(self, CP): self.STEER_DELTA_DOWN = 10 # Min HCA reached in 0.60s (STEER_MAX / (50Hz * 0.60)) if CP.transmissionType == TransmissionType.automatic: - self.shifter_values = can_define.dv["Gateway_73"]["GE_Fahrstufe"] + self.shifter_values = can_define.dv["Getriebe_11"]["GE_Fahrstufe"] elif CP.transmissionType == TransmissionType.direct: self.shifter_values = can_define.dv["Motor_EV_01"]["MO_Waehlpos"] self.hca_status_values = can_define.dv["LH_EPS_03"]["EPS_HCA_Status"] @@ -134,7 +132,7 @@ class WMI(StrEnum): class VolkswagenSafetyFlags(IntFlag): - LONG_CONTROL = 1 + FLAG_VOLKSWAGEN_LONG_CONTROL = 1 class VolkswagenFlags(IntFlag): @@ -453,9 +451,8 @@ def match_fw_to_car_fuzzy(live_fw_versions, vin, offline_fw_versions) -> set[str all_ecu_versions[ecu] |= set(versions) # Check the WMI and chassis code to determine the platform - # https://www.clubvw.org.au/vwreference/vwvin - vin_obj = Vin(vin) - chassis_code = vin_obj.vds[3:5] + wmi = vin[:3] + chassis_code = vin[6:8] for platform in CAR: valid_ecus = set() @@ -475,7 +472,7 @@ def match_fw_to_car_fuzzy(live_fw_versions, vin, offline_fw_versions) -> set[str if valid_ecus != CHECK_FUZZY_ECUS: continue - if vin_obj.wmi in platform.config.wmis and chassis_code in platform.config.chassis_codes: + if wmi in platform.config.wmis and chassis_code in platform.config.chassis_codes: candidates.add(platform) return {str(c) for c in candidates} diff --git a/opendbc/car/xcp.py b/opendbc/car/xcp.py deleted file mode 100644 index c5cf99c77b2..00000000000 --- a/opendbc/car/xcp.py +++ /dev/null @@ -1,258 +0,0 @@ -import sys -import time -import struct -from enum import IntEnum - -class COMMAND_CODE(IntEnum): - CONNECT = 0xFF - DISCONNECT = 0xFE - GET_STATUS = 0xFD - SYNCH = 0xFC - GET_COMM_MODE_INFO = 0xFB - GET_ID = 0xFA - SET_REQUEST = 0xF9 - GET_SEED = 0xF8 - UNLOCK = 0xF7 - SET_MTA = 0xF6 - UPLOAD = 0xF5 - SHORT_UPLOAD = 0xF4 - BUILD_CHECKSUM = 0xF3 - TRANSPORT_LAYER_CMD = 0xF2 - USER_CMD = 0xF1 - DOWNLOAD = 0xF0 - DOWNLOAD_NEXT = 0xEF - DOWNLOAD_MAX = 0xEE - SHORT_DOWNLOAD = 0xED - MODIFY_BITS = 0xEC - SET_CAL_PAGE = 0xEB - GET_CAL_PAGE = 0xEA - GET_PAG_PROCESSOR_INFO = 0xE9 - GET_SEGMENT_INFO = 0xE8 - GET_PAGE_INFO = 0xE7 - SET_SEGMENT_MODE = 0xE6 - GET_SEGMENT_MODE = 0xE5 - COPY_CAL_PAGE = 0xE4 - CLEAR_DAQ_LIST = 0xE3 - SET_DAQ_PTR = 0xE2 - WRITE_DAQ = 0xE1 - SET_DAQ_LIST_MODE = 0xE0 - GET_DAQ_LIST_MODE = 0xDF - START_STOP_DAQ_LIST = 0xDE - START_STOP_SYNCH = 0xDD - GET_DAQ_CLOCK = 0xDC - READ_DAQ = 0xDB - GET_DAQ_PROCESSOR_INFO = 0xDA - GET_DAQ_RESOLUTION_INFO = 0xD9 - GET_DAQ_LIST_INFO = 0xD8 - GET_DAQ_EVENT_INFO = 0xD7 - FREE_DAQ = 0xD6 - ALLOC_DAQ = 0xD5 - ALLOC_ODT = 0xD4 - ALLOC_ODT_ENTRY = 0xD3 - PROGRAM_START = 0xD2 - PROGRAM_CLEAR = 0xD1 - PROGRAM = 0xD0 - PROGRAM_RESET = 0xCF - GET_PGM_PROCESSOR_INFO = 0xCE - GET_SECTOR_INFO = 0xCD - PROGRAM_PREPARE = 0xCC - PROGRAM_FORMAT = 0xCB - PROGRAM_NEXT = 0xCA - PROGRAM_MAX = 0xC9 - PROGRAM_VERIFY = 0xC8 - -ERROR_CODES = { - 0x00: "Command processor synchronization", - 0x10: "Command was not executed", - 0x11: "Command rejected because DAQ is running", - 0x12: "Command rejected because PGM is running", - 0x20: "Unknown command or not implemented optional command", - 0x21: "Command syntax invalid", - 0x22: "Command syntax valid but command parameter(s) out of range", - 0x23: "The memory location is write protected", - 0x24: "The memory location is not accessible", - 0x25: "Access denied, Seed & Key is required", - 0x26: "Selected page not available", - 0x27: "Selected page mode not available", - 0x28: "Selected segment not valid", - 0x29: "Sequence error", - 0x2A: "DAQ configuration not valid", - 0x30: "Memory overflow error", - 0x31: "Generic error", - 0x32: "The slave internal program verify routine detects an error", -} - -class CONNECT_MODE(IntEnum): - NORMAL = 0x00, - USER_DEFINED = 0x01, - -class GET_ID_REQUEST_TYPE(IntEnum): - ASCII = 0x00, - ASAM_MC2_FILE = 0x01, - ASAM_MC2_PATH = 0x02, - ASAM_MC2_URL = 0x03, - ASAM_MC2_UPLOAD = 0x04, - # 128-255 user defined - -class CommandTimeoutError(Exception): - pass - -class CommandCounterError(Exception): - pass - -class CommandResponseError(Exception): - def __init__(self, message, return_code): - super().__init__() - self.message = message - self.return_code = return_code - - def __str__(self): - return self.message - -class XcpClient: - def __init__(self, panda, tx_addr: int, rx_addr: int, bus: int=0, timeout: float=0.1, debug=False, pad=True): - self.tx_addr = tx_addr - self.rx_addr = rx_addr - self.can_bus = bus - self.timeout = timeout - self.debug = debug - self._panda = panda - self._byte_order = ">" - self._max_cto = 8 - self._max_dto = 8 - self.pad = pad - - def _send_cto(self, cmd: int, dat: bytes = b"") -> None: - tx_data = (bytes([cmd]) + dat) - - # Some ECUs don't respond if the packets are not padded to 8 bytes - if self.pad: - tx_data = tx_data.ljust(8, b"\x00") - - if self.debug: - print("CAN-CLEAR: TX") - self._panda.can_clear(self.can_bus) - if self.debug: - print("CAN-CLEAR: RX") - self._panda.can_clear(0xFFFF) - if self.debug: - print(f"CAN-TX: {hex(self.tx_addr)} - 0x{bytes.hex(tx_data)}") - self._panda.can_send(self.tx_addr, tx_data, self.can_bus) - - def _recv_dto(self, timeout: float) -> bytes: - start_time = time.time() - while time.time() - start_time < timeout: - msgs = self._panda.can_recv() or [] - if len(msgs) >= 256: - print("CAN RX buffer overflow!!!", file=sys.stderr) - for rx_addr, rx_data, rx_bus in msgs: - if rx_bus == self.can_bus and rx_addr == self.rx_addr: - rx_data = bytes(rx_data) # convert bytearray to bytes - if self.debug: - print(f"CAN-RX: {hex(rx_addr)} - 0x{bytes.hex(rx_data)}") - - pid = rx_data[0] - if pid == 0xFE: - err = rx_data[1] - err_desc = ERROR_CODES.get(err, "unknown error") - dat = rx_data[2:] - raise CommandResponseError(f"{hex(err)} - {err_desc} {dat}", err) - - return bytes(rx_data[1:]) - time.sleep(0.001) - - raise CommandTimeoutError("timeout waiting for response") - - # commands - def connect(self, connect_mode: CONNECT_MODE=CONNECT_MODE.NORMAL) -> dict: - self._send_cto(COMMAND_CODE.CONNECT, bytes([connect_mode])) - resp = self._recv_dto(self.timeout) - assert len(resp) == 7, f"incorrect data length: {len(resp)}" - self._byte_order = ">" if resp[1] & 0x01 else "<" - self._slave_block_mode = resp[1] & 0x40 != 0 - self._max_cto = resp[2] - self._max_dto = struct.unpack(f"{self._byte_order}H", resp[3:5])[0] - return { - "cal_support": resp[0] & 0x01 != 0, - "daq_support": resp[0] & 0x04 != 0, - "stim_support": resp[0] & 0x08 != 0, - "pgm_support": resp[0] & 0x10 != 0, - "byte_order": self._byte_order, - "address_granularity": 2**((resp[1] & 0x06) >> 1), - "slave_block_mode": self._slave_block_mode, - "optional": resp[1] & 0x80 != 0, - "max_cto": self._max_cto, - "max_dto": self._max_dto, - "protocol_version": resp[5], - "transport_version": resp[6], - } - - def disconnect(self) -> None: - self._send_cto(COMMAND_CODE.DISCONNECT) - resp = self._recv_dto(self.timeout) - assert len(resp) == 0, f"incorrect data length: {len(resp)}" - - def get_id(self, req_id_type: GET_ID_REQUEST_TYPE = GET_ID_REQUEST_TYPE.ASCII) -> dict: - if req_id_type > 255: - raise ValueError("request id type must be less than 255") - self._send_cto(COMMAND_CODE.GET_ID, bytes([req_id_type])) - resp = self._recv_dto(self.timeout) - return { - # mode = 0 means MTA was set - # mode = 1 means data is at end (only CAN-FD has space for this) - "mode": resp[0], - "length": struct.unpack(f"{self._byte_order}I", resp[3:7])[0], - "identifier": resp[7:] if self._max_cto > 8 else None - } - - def get_seed(self, mode: int = 0) -> bytes: - if mode > 255: - raise ValueError("mode must be less than 255") - self._send_cto(COMMAND_CODE.GET_SEED, bytes([0, mode])) - - # TODO: add support for longer seeds spread over multiple blocks - ret = self._recv_dto(self.timeout) - length = ret[0] - return ret[1:length+1] - - def unlock(self, key: bytes) -> bytes: - # TODO: add support for longer keys spread over multiple blocks - self._send_cto(COMMAND_CODE.UNLOCK, bytes([len(key)]) + key) - return self._recv_dto(self.timeout) - - def set_mta(self, addr: int, addr_ext: int = 0) -> bytes: - if addr_ext > 255: - raise ValueError("address extension must be less than 256") - # TODO: this looks broken (missing addr extension) - self._send_cto(COMMAND_CODE.SET_MTA, bytes([0x00, 0x00, addr_ext]) + struct.pack(f"{self._byte_order}I", addr)) - return self._recv_dto(self.timeout) - - def upload(self, size: int) -> bytes: - if size > 255: - raise ValueError("size must be less than 256") - if not self._slave_block_mode and size > self._max_dto - 1: - raise ValueError("block mode not supported") - - self._send_cto(COMMAND_CODE.UPLOAD, bytes([size])) - resp = b"" - while len(resp) < size: - resp += self._recv_dto(self.timeout)[:size - len(resp) + 1] - return resp[:size] # trim off bytes with undefined values - - def short_upload(self, size: int, addr_ext: int, addr: int) -> bytes: - if size > 6: - raise ValueError("size must be less than 7") - if addr_ext > 255: - raise ValueError("address extension must be less than 256") - self._send_cto(COMMAND_CODE.SHORT_UPLOAD, bytes([size, 0x00, addr_ext]) + struct.pack(f"{self._byte_order}I", addr)) - return self._recv_dto(self.timeout)[:size] # trim off bytes with undefined values - - def download(self, data: bytes) -> bytes: - size = len(data) - if size > 255: - raise ValueError("size must be less than 256") - if not self._slave_block_mode and size > self._max_dto - 2: - raise ValueError("block mode not supported") - - self._send_cto(COMMAND_CODE.DOWNLOAD, bytes([size]) + data) - return self._recv_dto(self.timeout)[:size] diff --git a/opendbc/dbc/SConscript b/opendbc/dbc/SConscript index 9a92912074c..c24e5daa81b 100644 --- a/opendbc/dbc/SConscript +++ b/opendbc/dbc/SConscript @@ -7,7 +7,7 @@ generator = File("generator/generator.py") source_files = [ File(str(f)) for f in Path("generator").rglob("*") - if f.is_file() and f.suffix in {".py", ".dbc"} + if f.is_file() and f.suffix in {".py", ".dbc"} and not (f.suffix == ".dbc" and f.name.startswith("_")) ] output_files = [ diff --git a/opendbc/dbc/generator/honda/_honda_common.dbc b/opendbc/dbc/generator/honda/_honda_common.dbc index 44a2ce4bcc7..d9feb98dc8a 100644 --- a/opendbc/dbc/generator/honda/_honda_common.dbc +++ b/opendbc/dbc/generator/honda/_honda_common.dbc @@ -87,7 +87,7 @@ BO_ 780 ACC_HUD: 8 ADAS SG_ PCM_GAS : 23|8@0+ (1,0) [0|127] "" BDY SG_ CRUISE_SPEED : 31|8@0+ (1,0) [0|255] "kph" BDY SG_ DTC_MODE : 39|1@0+ (1,0) [0|1] "" BDY - SG_ BRAKE_SYSTEM_ICON : 38|1@0+ (1,0) [0|1] "" BDY + SG_ BOH : 38|1@0+ (1,0) [0|1] "" BDY SG_ ACC_PROBLEM : 37|1@0+ (1,0) [0|1] "" BDY SG_ FCM_OFF : 35|1@0+ (1,0) [0|1] "" BDY SG_ FCM_OFF_2 : 36|1@0+ (1,0) [0|1] "" BDY diff --git a/opendbc/dbc/generator/honda/_nidec_common.dbc b/opendbc/dbc/generator/honda/_nidec_common.dbc index 36611eebcfe..142508911dd 100644 --- a/opendbc/dbc/generator/honda/_nidec_common.dbc +++ b/opendbc/dbc/generator/honda/_nidec_common.dbc @@ -60,17 +60,16 @@ BO_ 829 LKAS_HUD: 5 ADAS SG_ CAM_TEMP_HIGH : 7|1@0+ (1,0) [0|255] "" BDY SG_ SET_ME_X41 : 6|7@0+ (1,0) [0|127] "" BDY SG_ BOH : 6|7@0+ (1,0) [0|127] "" BDY - SG_ CAMERA_OVERHEAT : 15|1@0+ (1,0) [0|1] "" BDY SG_ DASHED_LANES : 14|1@0+ (1,0) [0|1] "" BDY SG_ DTC : 13|1@0+ (1,0) [0|1] "" BDY SG_ LKAS_PROBLEM : 12|1@0+ (1,0) [0|1] "" BDY SG_ LKAS_OFF : 11|1@0+ (1,0) [0|1] "" BDY SG_ SOLID_LANES : 10|1@0+ (1,0) [0|1] "" BDY - SG_ LANE_DEPARTURE_ALERT : 9|1@0+ (1,0) [0|1] "" BDY + SG_ LDW_RIGHT : 9|1@0+ (1,0) [0|1] "" BDY SG_ STEERING_REQUIRED : 8|1@0+ (1,0) [0|1] "" BDY - SG_ LDW_ICON : 22|1@0+ (1,0) [0|1] "" BDY + SG_ BOH_2 : 23|2@0+ (1,0) [0|4] "" BDY SG_ LDW_PROBLEM : 21|1@0+ (1,0) [0|1] "" BDY - SG_ BEEP : 18|3@0+ (1,0) [0|7] "" BDY + SG_ BEEP : 17|2@0+ (1,0) [0|1] "" BDY SG_ LDW_ON : 28|1@0+ (1,0) [0|1] "" BDY SG_ LDW_OFF : 27|1@0+ (1,0) [0|1] "" BDY SG_ CLEAN_WINDSHIELD : 26|1@0+ (1,0) [0|1] "" BDY @@ -87,10 +86,8 @@ CM_ SG_ 506 AEB_REQ_1 "set for duration of suspected AEB event"; CM_ SG_ 506 COMPUTER_BRAKE_ALT "Used by dual-can Nidec"; CM_ SG_ 506 BRAKE_PUMP_REQUEST_ALT "Used by dual-can Nidec"; CM_ SG_ 829 BEEP "beeps are pleasant, chimes are for warnngs etc..."; -CM_ SG_ 829 CAM_TEMP_HIGH "Some Driver Assist Systems Cannot Operate: Camera Temperature Too High"; -CM_ SG_ 829 CAMERA_OVERHEAT "Lane Keeping Assist Cannot Operate: Camera Too Hot"; VAL_ 506 FCW 3 "fcw" 2 "fcw" 1 "fcw" 0 "no_fcw"; VAL_ 506 CHIME 4 "double_chime" 3 "single_chime" 2 "continuous_chime" 1 "repeating_chime" 0 "no_chime"; VAL_ 506 AEB_STATUS 3 "aeb_prepare" 2 "aeb_ready" 1 "aeb_braking" 0 "no_aeb"; -VAL_ 829 BEEP 5 "solid_beep" 4 "double_beep" 3 "single_beep" 2 "triple_beep" 1 "repeated_beep" 0 "no_beep"; +VAL_ 829 BEEP 3 "single_beep" 2 "triple_beep" 1 "repeated_beep" 0 "no_beep"; diff --git a/opendbc/dbc/generator/honda/honda_pilot_2023_can.dbc b/opendbc/dbc/generator/honda/honda_pilot_2023_can.dbc index 646245b74c7..df84d623fbf 100644 --- a/opendbc/dbc/generator/honda/honda_pilot_2023_can.dbc +++ b/opendbc/dbc/generator/honda/honda_pilot_2023_can.dbc @@ -2,11 +2,6 @@ CM_ "IMPORT _honda_common.dbc"; CM_ "IMPORT _bosch_2018.dbc"; CM_ "IMPORT _steering_sensors_a.dbc"; -BO_ 401 GEARBOX_15T: 8 PCM - SG_ GEAR_SHIFTER : 5|6@0+ (1,0) [0|63] "" EON - SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON - SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON - BO_ 419 GEARBOX: 8 XXX SG_ GEAR_SHIFTER : 24|8@1+ (1,0) [0|255] "" XXX SG_ GEAR : 32|8@1+ (1,0) [0|255] "" XXX @@ -85,7 +80,6 @@ CM_ SG_ 479 AEB_PREPARE "set 1s before AEB"; CM_ SG_ 829 BEEP "beeps are pleasant, chimes are for warnings etc..."; CM_ SG_ 829 LANE_LINES "related to lane lines on cluster, left/right white/green"; -VAL_ 401 GEAR_SHIFTER 32 "L" 16 "S" 8 "D" 4 "N" 2 "R" 1 "P"; VAL_ 419 GEAR_SHIFTER 2 "S" 32 "D" 16 "N" 8 "R" 4 "P"; VAL_ 419 GEAR 26 "S" 20 "D" 19 "N" 18 "R" 17 "P"; VAL_ 829 BEEP 3 "single_beep" 2 "triple_beep" 1 "repeated_beep" 0 "no_beep"; diff --git a/opendbc/dbc/generator/hyundai/_hyundai_common.dbc b/opendbc/dbc/generator/hyundai/_hyundai_common.dbc deleted file mode 100644 index edc5ded364c..00000000000 --- a/opendbc/dbc/generator/hyundai/_hyundai_common.dbc +++ /dev/null @@ -1,232 +0,0 @@ -VERSION "" - - -NS_ : - NS_DESC_ - CM_ - BA_DEF_ - BA_ - VAL_ - CAT_DEF_ - CAT_ - FILTER - BA_DEF_DEF_ - EV_DATA_ - ENVVAR_DATA_ - SGTYPE_ - SGTYPE_VAL_ - BA_DEF_SGTYPE_ - BA_SGTYPE_ - SIG_TYPE_REF_ - VAL_TABLE_ - SIG_GROUP_ - SIG_VALTYPE_ - SIGTYPE_VALTYPE_ - BO_TX_BU_ - BA_DEF_REL_ - BA_REL_ - BA_DEF_DEF_REL_ - BU_SG_REL_ - BU_EV_REL_ - BU_BO_REL_ - SG_MUL_VAL_ - -BS_: - -BU_: XXX CAMERA FRONT_RADAR ADRV APRK - - -BO_ 80 LKAS: 16 XXX - SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX - SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX - SG_ LKA_MODE : 24|3@1+ (1,0) [0|7] "" XXX - SG_ LKA_AVAILABLE : 27|2@1+ (1,0) [0|255] "" XXX - SG_ LKA_WARNING : 32|1@1+ (1,0) [0|1] "" XXX - SG_ LKA_ICON : 38|2@1+ (1,0) [0|255] "" XXX - SG_ FCA_SYSWARN : 40|1@0+ (1,0) [0|1] "" XXX - SG_ TORQUE_REQUEST : 41|11@1+ (1,-1024) [0|4095] "" XXX - SG_ STEER_REQ : 52|1@1+ (1,0) [0|1] "" XXX - SG_ LFA_BUTTON : 56|1@1+ (1,0) [0|255] "" XXX - SG_ LKA_ASSIST : 62|1@1+ (1,0) [0|1] "" XXX - SG_ STEER_MODE : 65|3@1+ (1,0) [0|1] "" XXX - SG_ NEW_SIGNAL_2 : 70|2@0+ (1,0) [0|3] "" XXX - SG_ HAS_LANE_SAFETY : 80|1@0+ (1,0) [0|1] "" XXX - SG_ NEW_SIGNAL_3 : 111|8@0+ (1,0) [0|255] "" XXX - -BO_ 81 ADRV_0x51: 32 ADRV - SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX - SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX - -BO_ 384 CAM_0x180: 32 CAMERA - SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX - SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX - -BO_ 385 CAM_0x181: 32 CAMERA - SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX - SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX - -BO_ 386 CAM_0x182: 32 CAMERA - SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX - SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX - -BO_ 387 CAM_0x183: 32 CAMERA - SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX - SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX - -BO_ 388 CAM_0x184: 32 CAMERA - SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX - SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX - -BO_ 389 CAM_0x185: 8 CAMERA - SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX - SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX - -BO_ 438 CAM_0x1b6: 32 CAMERA - SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX - SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX - -BO_ 439 CAM_0x1b7: 32 CAMERA - SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX - SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX - -BO_ 440 CAM_0x1b8: 32 CAMERA - SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX - SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX - -BO_ 441 CAM_0x1b9: 32 CAMERA - SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX - SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX - -BO_ 513 RADAR_0x201: 32 FRONT_RADAR - SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX - SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX - -BO_ 528 RADAR_0x210: 32 FRONT_RADAR - SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX - SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX - -BO_ 529 RADAR_0x211: 32 FRONT_RADAR - SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX - SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX - -BO_ 530 RADAR_0x212: 32 FRONT_RADAR - SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX - SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX - -BO_ 531 RADAR_0x213: 32 FRONT_RADAR - SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX - SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX - -BO_ 532 RADAR_0x214: 32 FRONT_RADAR - SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX - SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX - -BO_ 533 RADAR_0x215: 32 FRONT_RADAR - SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX - SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX - -BO_ 534 RADAR_0x216: 32 FRONT_RADAR - SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX - SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX - -BO_ 535 RADAR_0x217: 32 FRONT_RADAR - SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX - SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX - -BO_ 536 RADAR_0x218: 32 FRONT_RADAR - SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX - SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX - -BO_ 537 RADAR_0x219: 32 FRONT_RADAR - SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX - SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX - -BO_ 538 RADAR_0x21a: 32 FRONT_RADAR - SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX - SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX - -BO_ 539 RADAR_0x21b: 32 FRONT_RADAR - SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX - SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX - -BO_ 540 RADAR_0x21c: 32 FRONT_RADAR - SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX - SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX - -BO_ 541 RADAR_0x21d: 32 FRONT_RADAR - SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX - SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX - -BO_ 542 RADAR_0x21e: 32 FRONT_RADAR - SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX - SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX - -BO_ 543 RADAR_0x21f: 32 FRONT_RADAR - SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX - SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX - -BO_ 576 RADAR_0x240: 16 FRONT_RADAR - SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX - SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX - -BO_ 674 CAM_0x2a2: 32 CAMERA - SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX - SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX - -BO_ 675 CAM_0x2a3: 32 CAMERA - SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX - SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX - -BO_ 676 CAM_0x2a4: 24 XXX - SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX - SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX - SG_ BYTE3 : 24|8@1+ (1,0) [0|255] "" XXX - SG_ BYTE4 : 32|8@1+ (1,0) [0|255] "" XXX - SG_ BYTE5 : 40|8@1+ (1,0) [0|255] "" XXX - SG_ BYTE6 : 48|8@1+ (1,0) [0|255] "" XXX - SG_ LEFT_LANE_LINE : 56|2@1+ (1,0) [0|3] "" XXX - SG_ SET_ME_0 : 58|2@1+ (1,0) [0|3] "" XXX - SG_ RIGHT_LANE_LINE : 60|2@1+ (1,0) [0|3] "" XXX - SG_ SET_ME_0_2 : 62|2@1+ (1,0) [0|3] "" XXX - SG_ BYTE8 : 64|8@1+ (1,0) [0|255] "" XXX - SG_ BYTE9 : 72|8@1+ (1,0) [0|255] "" XXX - SG_ BYTE10 : 80|8@1+ (1,0) [0|255] "" XXX - SG_ BYTE11 : 88|8@1+ (1,0) [0|255] "" XXX - SG_ BYTE12 : 96|8@1+ (1,0) [0|255] "" XXX - SG_ BYTE13 : 104|8@1+ (1,0) [0|255] "" XXX - SG_ BYTE14 : 112|8@1+ (1,0) [0|255] "" XXX - SG_ BYTE15 : 120|8@1+ (1,0) [0|255] "" XXX - SG_ BYTE16 : 128|8@1+ (1,0) [0|255] "" XXX - SG_ BYTE17 : 136|8@1+ (1,0) [0|255] "" XXX - SG_ BYTE18 : 144|8@1+ (1,0) [0|255] "" XXX - SG_ BYTE19 : 152|8@1+ (1,0) [0|255] "" XXX - SG_ BYTE20 : 160|8@1+ (1,0) [0|255] "" XXX - SG_ BYTE21 : 168|8@1+ (1,0) [0|255] "" XXX - SG_ BYTE22 : 176|8@1+ (1,0) [0|255] "" XXX - SG_ BYTE23 : 184|8@1+ (1,0) [0|255] "" XXX - -BO_ 699 CAM_0x2bb: 32 CAMERA - SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX - SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX - -BO_ 700 CAM_0x2bc: 32 CAMERA - SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX - SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX - -BO_ 701 CAM_0x2bd: 32 CAMERA - SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX - SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX - -BO_ 702 CAM_0x2be: 32 CAMERA - SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX - SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX - -CM_ BO_ 676 "Contains signals with detailed lane line information. Used by ADAS ECU on HDA 2 vehicles to operate LFA."; - -CM_ SG_ 80 HAS_LANE_SAFETY "If 0, hides LKAS 'Lane Safety' menu from vehicle settings"; -CM_ SG_ 676 LEFT_LANE_LINE "Left lane line confidence"; -CM_ SG_ 676 RIGHT_LANE_LINE "Right lane line confidence"; -VAL_ 80 LKA_ICON 0 "hidden" 1 "grey" 2 "green" 3 "flashing green" ; -VAL_ 80 LKA_MODE 1 "warning only" 2 "assist" 6 "off" ; -VAL_ 676 LEFT_LANE_LINE 0 "Not Detected" 1 "Low Confidence" 2 "Medium Confidence" 3 "High Confidence"; -VAL_ 676 RIGHT_LANE_LINE 0 "Not Detected" 1 "Low Confidence" 2 "Medium Confidence" 3 "High Confidence"; diff --git a/opendbc/dbc/generator/hyundai/hyundai_palisade_2023.dbc b/opendbc/dbc/generator/hyundai/hyundai_palisade_2023.dbc deleted file mode 100644 index b8ecca76661..00000000000 --- a/opendbc/dbc/generator/hyundai/hyundai_palisade_2023.dbc +++ /dev/null @@ -1,865 +0,0 @@ -CM_ "IMPORT _hyundai_common.dbc"; - -BO_ 67 DATC13: 8 XXX - SG_ CF_Datc_AcDisp : 22|2@1+ (1,0) [0|0] "" XXX - SG_ CF_Datc_AqsDisp : 20|2@1+ (1,0) [0|0] "" XXX - SG_ CF_Datc_AutoDefogBlink : 16|2@1+ (1,0) [0|0] "" XXX - SG_ CF_Datc_AutoDisp : 12|2@1+ (1,0) [0|0] "" XXX - SG_ CF_Datc_ChgReqDisp : 8|2@1+ (1,0) [0|0] "" XXX - SG_ CF_Datc_ClmScanDisp : 18|2@1+ (1,0) [0|0] "" XXX - SG_ CF_Datc_DualDisp : 30|2@1+ (1,0) [0|0] "" XXX - SG_ CF_Datc_FrDefLed : 14|2@1+ (1,0) [0|0] "" XXX - SG_ CF_Datc_FrontBlwDisp : 60|4@1+ (1,0) [0|0] "" XXX - SG_ CF_Datc_IntakeDisp : 10|2@1+ (1,0) [0|0] "" XXX - SG_ CF_Datc_IonClean : 6|2@1+ (1,0) [0|0] "" XXX - SG_ CF_Datc_ModDisp : 2|4@1+ (1,0) [0|0] "" XXX - SG_ CF_Datc_OpSts : 25|3@1+ (1,0) [0|0] "" XXX - SG_ CF_Datc_PSModDisp : 56|4@1+ (1,0) [0|0] "" XXX - SG_ CF_Datc_PwrInf : 32|4@1+ (1,0) [0|0] "" XXX - SG_ CF_Datc_RearAutoDisp : 40|2@1+ (1,0) [0|0] "" XXX - SG_ CF_Datc_RearBlwDisp : 52|4@1+ (1,0) [0|0] "" XXX - SG_ CF_Datc_RearChgReqDisp : 46|2@1+ (1,0) [0|0] "" XXX - SG_ CF_Datc_RearClimateScnDisp : 44|2@1+ (1,0) [0|0] "" XXX - SG_ CF_Datc_RearManual : 38|2@1+ (1,0) [0|0] "" XXX - SG_ CF_Datc_RearModDisp : 48|4@1+ (1,0) [0|0] "" XXX - SG_ CF_Datc_RearOffDisp : 42|2@1+ (1,0) [0|0] "" XXX - SG_ CF_Datc_TempDispUnit : 0|2@1+ (1,0) [0|0] "" XXX - SG_ CF_Mtc_MaxAcDisp : 28|2@1+ (1,0) [0|0] "" XXX - -BO_ 127 CGW5: 8 XXX - SG_ C_DRLLampLhOpenSts : 7|1@1+ (1,0) [0|0] "" XXX - SG_ C_DRLLampRhOpenSts : 8|1@1+ (1,0) [0|0] "" XXX - SG_ C_FrontEXTTailLhOpenSts : 15|1@1+ (1,0) [0|0] "" XXX - SG_ C_FrontEXTTailRhOpenSts : 16|1@1+ (1,0) [0|0] "" XXX - SG_ C_FrontFOGLhOpenSts : 11|1@1+ (1,0) [0|0] "" XXX - SG_ C_FrontFOGRhOpenSts : 12|1@1+ (1,0) [0|0] "" XXX - SG_ C_FrontTSIGLhOpenSts : 19|1@1+ (1,0) [0|0] "" XXX - SG_ C_FrontTSIGRhOpenSts : 20|1@1+ (1,0) [0|0] "" XXX - SG_ C_HLampHighLhOpenSts : 5|1@1+ (1,0) [0|0] "" XXX - SG_ C_HLampHighRhOpenSts : 6|1@1+ (1,0) [0|0] "" XXX - SG_ C_HLampLowLhOpenSts : 3|1@1+ (1,0) [0|0] "" XXX - SG_ C_HLampLowRhOpenSts : 4|1@1+ (1,0) [0|0] "" XXX - SG_ C_HMSLOpenSts : 2|1@1+ (1,0) [0|0] "" XXX - SG_ C_LicensePlateLhOpenSts : 23|1@1+ (1,0) [0|0] "" XXX - SG_ C_LicensePlateRhOpenSts : 24|1@1+ (1,0) [0|0] "" XXX - SG_ C_RearEXTTailLhOpenSts : 13|1@1+ (1,0) [0|0] "" XXX - SG_ C_RearEXTTailRhOpenSts : 14|1@1+ (1,0) [0|0] "" XXX - SG_ C_RearFOGLhOpenSts : 9|1@1+ (1,0) [0|0] "" XXX - SG_ C_RearFOGRhOpenSts : 10|1@1+ (1,0) [0|0] "" XXX - SG_ C_RearTSIGLhOpenSts : 17|1@1+ (1,0) [0|0] "" XXX - SG_ C_RearTSIGRhOpenSts : 18|1@1+ (1,0) [0|0] "" XXX - SG_ C_SBendingLhOpenSts : 21|1@1+ (1,0) [0|0] "" XXX - SG_ C_SBendingRhOpenSts : 22|1@1+ (1,0) [0|0] "" XXX - SG_ C_StopLampLhOpenSts : 0|1@1+ (1,0) [0|0] "" XXX - SG_ C_StopLampRhOpenSts : 1|1@1+ (1,0) [0|0] "" XXX - -BO_ 304 YRS11: 8 XXX - SG_ CF_Yrs_LatAcStat : 36|4@1+ (1,0) [0|0] "" XXX - SG_ CF_Yrs_MCUStat : 40|4@1+ (1,0) [0|0] "" XXX - SG_ CF_Yrs_YrStat : 32|4@1+ (1,0) [0|0] "" XXX - SG_ CR_Yrs_Crc1 : 56|8@1+ (1,0) [0|0] "" XXX - SG_ CR_Yrs_LatAc : 16|16@1+ (0.000127465,-4.17677312) [0|0] "" XXX - SG_ CR_Yrs_MsgCnt1 : 48|4@1+ (1,0) [0|0] "" XXX - SG_ CR_Yrs_Yr : 0|16@1+ (0.005,-163.84) [0|0] "" XXX - -BO_ 320 YRS12: 8 XXX - SG_ CF_IMU_ResetStat : 20|4@1+ (1,0) [0|0] "" XXX - SG_ CF_Yrs_LongAcStat : 16|4@1+ (1,0) [0|0] "" XXX - SG_ CF_Yrs_Type : 36|4@1+ (1,0) [0|0] "" XXX - SG_ CR_Yrs_Crc2 : 56|8@1+ (1,0) [0|0] "" XXX - SG_ CR_Yrs_LongAc : 0|16@1+ (0.000127465,-4.17677312) [0|0] "" XXX - SG_ CR_Yrs_MsgCnt2 : 48|4@1+ (1,0) [0|0] "" XXX - SG_ YRS_Temp : 24|8@1+ (1,-68) [0|0] "" XXX - SG_ YRS_TempStat : 32|4@1+ (1,0) [0|0] "" XXX - -BO_ 339 TCS11: 8 XXX - SG_ ABS_ACT : 10|1@1+ (1,0) [0|0] "" XXX - SG_ ABS_DEF : 7|1@1+ (1,0) [0|0] "" XXX - SG_ ABS_DIAG : 6|1@1+ (1,0) [0|0] "" XXX - SG_ AliveCounter_TCS1 : 52|4@1+ (1,0) [0|0] "" XXX - SG_ BLA_CTL : 49|2@1+ (1,0) [0|0] "" XXX - SG_ CF_Esc_BrkCtl : 48|1@1+ (1,0) [0|0] "" XXX - SG_ CF_Esc_LimoInfo : 4|2@1+ (1,0) [0|0] "" XXX - SG_ CheckSum_TCS1 : 56|8@1+ (1,0) [0|0] "" XXX - SG_ DBC_CTL : 16|1@1+ (1,0) [0|0] "" XXX - SG_ DBC_DEF : 18|1@1+ (1,0) [0|0] "" XXX - SG_ DBC_PAS : 17|1@1+ (1,0) [0|0] "" XXX - SG_ EBD_DEF : 11|1@1+ (1,0) [0|0] "" XXX - SG_ ESP_CTL : 14|1@1+ (1,0) [0|0] "" XXX - SG_ ESP_DEF : 13|1@1+ (1,0) [0|0] "" XXX - SG_ ESP_PAS : 12|1@1+ (1,0) [0|0] "" XXX - SG_ ESS_STAT : 22|2@1+ (1,0) [0|0] "" XXX - SG_ HAC_CTL : 19|1@1+ (1,0) [0|0] "" XXX - SG_ HAC_DEF : 21|1@1+ (1,0) [0|0] "" XXX - SG_ HAC_PAS : 20|1@1+ (1,0) [0|0] "" XXX - SG_ MSR_C_REQ : 1|1@1+ (1,0) [0|0] "" XXX - SG_ TCS_CTL : 9|1@1+ (1,0) [0|0] "" XXX - SG_ TCS_DEF : 8|1@1+ (1,0) [0|0] "" XXX - SG_ TCS_GSC : 3|1@1+ (1,0) [0|0] "" XXX - SG_ TCS_MFRN : 15|1@1+ (1,0) [0|0] "" XXX - SG_ TCS_PAS : 2|1@1+ (1,0) [0|0] "" XXX - SG_ TCS_REQ : 0|1@1+ (1,0) [0|0] "" XXX - SG_ TQI_MSR : 32|8@1+ (0.390625,0) [0|0] "" XXX - SG_ TQI_SLW_TCS : 40|8@1+ (0.390625,0) [0|0] "" XXX - SG_ TQI_TCS : 24|8@1+ (0.390625,0) [0|0] "" XXX - -BO_ 356 VSM11: 4 XXX - SG_ CF_Esc_Act : 12|1@1+ (1,0) [0|0] "" XXX - SG_ CF_Esc_AliveCnt : 17|4@1+ (1,0) [0|0] "" XXX - SG_ CF_Esc_Chksum : 24|8@1+ (1,0) [0|0] "" XXX - SG_ CF_Esc_CtrMode : 13|3@1+ (1,0) [0|0] "" XXX - SG_ CF_Esc_Def : 16|1@1+ (1,0) [0|0] "" XXX - SG_ CR_Esc_StrTqReq : 0|12@1+ (0.01,-20.48) [0|0] "" XXX - -BO_ 544 ESP12: 8 XXX - SG_ CYL_PRES : 26|12@1+ (0.1,0) [0|0] "" XXX - SG_ CYL_PRESS_DIAG : 39|1@1+ (1,0) [0|0] "" XXX - SG_ CYL_PRES_STAT : 38|1@1+ (1,0) [0|0] "" XXX - SG_ ESP12_AliveCounter : 60|4@1+ (1,0) [0|0] "" XXX - SG_ ESP12_Checksum : 56|4@1+ (1,0) [0|0] "" XXX - SG_ LAT_ACCEL : 0|11@1+ (0.01,-10.23) [0|0] "" XXX - SG_ LAT_ACCEL_DIAG : 12|1@1+ (1,0) [0|0] "" XXX - SG_ LAT_ACCEL_STAT : 11|1@1+ (1,0) [0|0] "" XXX - SG_ LONG_ACCEL : 13|11@1+ (0.01,-10.23) [0|0] "" XXX - SG_ LONG_ACCEL_DIAG : 25|1@1+ (1,0) [0|0] "" XXX - SG_ LONG_ACCEL_STAT : 24|1@1+ (1,0) [0|0] "" XXX - SG_ YAW_RATE : 40|13@1+ (0.01,-40.95) [0|0] "" XXX - SG_ YAW_RATE_DIAG : 54|1@1+ (1,0) [0|0] "" XXX - SG_ YAW_RATE_STAT : 53|1@1+ (1,0) [0|0] "" XXX - -BO_ 593 MDPS12: 8 XXX - SG_ CF_Mdps_Chksum2 : 24|8@1+ (1,0) [0|0] "" XXX - SG_ CF_Mdps_Def : 11|1@1+ (1,0) [0|0] "" XXX - SG_ CF_Mdps_FailStat : 15|1@1+ (1,0) [0|0] "" XXX - SG_ CF_Mdps_MsgCount2 : 16|8@1+ (1,0) [0|0] "" XXX - SG_ CF_Mdps_SErr : 37|1@1+ (1,0) [0|0] "" XXX - SG_ CF_Mdps_ToiActive : 13|1@1+ (1,0) [0|0] "" XXX - SG_ CF_Mdps_ToiFlt : 14|1@1+ (1,0) [0|0] "" XXX - SG_ CF_Mdps_ToiUnavail : 12|1@1+ (1,0) [0|0] "" XXX - SG_ CR_Mdps_OutTq : 52|12@1+ (0.1,-204.8) [0|0] "" XXX - SG_ CR_Mdps_StrColTq : 0|11@1+ (1,-1024) [0|0] "" XXX - SG_ CR_Mdps_StrTq : 40|12@1+ (0.01,-20.48) [0|0] "" XXX - -BO_ 608 EMS16: 8 XXX - SG_ AliveCounter : 60|2@1+ (1,0) [0|0] "" XXX - SG_ CF_Ems_AclAct : 62|2@1+ (1,0) [0|0] "" XXX - SG_ CRUISE_LAMP_M : 25|1@1+ (1,0) [0|0] "" XXX - SG_ CRUISE_LAMP_S : 26|1@1+ (1,0) [0|0] "" XXX - SG_ Checksum : 56|4@1+ (1,0) [0|0] "" XXX - SG_ ENG_STAT : 28|3@1+ (1,0) [0|0] "" XXX - SG_ GLOW_STAT : 24|1@1+ (1,0) [0|0] "" XXX - SG_ PRE_FUEL_CUT_IN : 27|1@1+ (1,0) [0|0] "" XXX - SG_ SOAK_TIME : 32|8@1+ (1,0) [0|0] "" XXX - SG_ SOAK_TIME_ERROR : 31|1@1+ (1,0) [0|0] "" XXX - SG_ SPK_TIME_CUR : 48|8@1+ (0.375,-35.625) [0|0] "" XXX - SG_ TQI : 8|8@1+ (0.390625,0) [0|0] "" XXX - SG_ TQI_MAX : 40|8@1+ (0.390625,0) [0|0] "" XXX - SG_ TQI_MIN : 0|8@1+ (0.390625,0) [0|0] "" XXX - SG_ TQI_TARGET : 16|8@1+ (0.390625,0) [0|0] "" XXX - -BO_ 625 LPI11: 8 XXX - SG_ BFS_CYL : 48|8@1+ (1,0) [0|0] "" XXX - SG_ ERR_GAS : 16|8@1+ (1,0) [0|0] "" XXX - SG_ FAC_TI_GAS_COR : 24|16@1+ (3.05e-05,0) [0|0] "" XXX - SG_ FTL_AFU : 40|8@1+ (0.392,0) [0|0] "" XXX - SG_ FUP_LPG_MMV : 0|8@1+ (128,0) [0|0] "" XXX - SG_ LPI_OBD : 12|4@1+ (1,0) [0|0] "" XXX - SG_ LV_BFS_IN_PROGRESS : 9|1@1+ (1,0) [0|0] "" XXX - SG_ LV_CONF_INJECTION_DELAY : 57|1@1+ (1,0) [0|0] "" XXX - SG_ LV_FUEL_TYPE_BOX : 8|1@1+ (1,0) [0|0] "" XXX - SG_ LV_FUP_ENA_THD : 11|1@1+ (1,0) [0|0] "" XXX - SG_ LV_GAS_OK : 10|1@1+ (1,0) [0|0] "" XXX - SG_ LV_LPG_SW_DRIVER_REQ : 58|1@1+ (1,0) [0|0] "" XXX - SG_ LV_PRE_CDN_LEAK : 56|1@1+ (1,0) [0|0] "" XXX - -BO_ 640 EMS13: 8 XXX - SG_ AMP : 56|8@1+ (21.22,0) [0|0] "" XXX - SG_ EOS : 16|8@1+ (1,0) [0|0] "" XXX - SG_ ERR_FUEL : 8|8@1+ (1,0) [0|0] "" XXX - SG_ LV_BFS_CFIRM : 1|1@1+ (1,0) [0|0] "" XXX - SG_ LV_CRASH : 2|1@1+ (1,0) [0|0] "" XXX - SG_ LV_ENG_TURN : 5|1@1+ (1,0) [0|0] "" XXX - SG_ LV_FUEL_TYPE_ECU : 0|1@1+ (1,0) [0|0] "" XXX - SG_ LV_GSL_MAP : 4|1@1+ (1,0) [0|0] "" XXX - SG_ LV_VB_OFF_ACT : 3|1@1+ (1,0) [0|0] "" XXX - SG_ MAF : 40|8@1+ (5.447,0) [0|0] "" XXX - SG_ MAP : 56|8@1+ (0.47058,0) [0|0] "" XXX - SG_ N_32 : 32|8@1+ (32,0) [0|0] "" XXX - SG_ TCO : 24|8@1+ (0.75,-48) [0|0] "" XXX - SG_ TIA : 48|8@1+ (0.75,-48) [0|0] "" XXX - -BO_ 688 SAS11: 5 XXX - SG_ CheckSum : 36|4@1+ (1,0) [0|0] "" XXX - SG_ MsgCount : 32|4@1+ (1,0) [0|0] "" XXX - SG_ SAS_Angle : 0|16@1- (0.1,0) [0|0] "" XXX - SG_ SAS_Speed : 16|8@1+ (4,0) [0|0] "" XXX - SG_ SAS_Stat : 24|8@1+ (1,0) [0|0] "" XXX - -BO_ 790 EMS11: 8 XXX - SG_ ACK_TCS : 2|1@1+ (1,0) [0|0] "" XXX - SG_ F_N_ENG : 1|1@1+ (1,0) [0|0] "" XXX - SG_ F_SUB_TQI : 7|1@1+ (1,0) [0|0] "" XXX - SG_ N : 16|16@1+ (0.25,0) [0|0] "" XXX - SG_ PUC_STAT : 3|1@1+ (1,0) [0|0] "" XXX - SG_ RATIO_TQI_BAS_MAX_STND : 56|8@1+ (0.0078,0) [0|0] "" XXX - SG_ RLY_AC : 6|1@1+ (1,0) [0|0] "" XXX - SG_ SWI_IGK : 0|1@1+ (1,0) [0|0] "" XXX - SG_ TQFR : 40|8@1+ (0.390625,0) [0|0] "" XXX - SG_ TQI : 32|8@1+ (0.390625,0) [0|0] "" XXX - SG_ TQI_ACOR : 8|8@1+ (0.390625,0) [0|0] "" XXX - SG_ TQ_COR_STAT : 4|2@1+ (1,0) [0|0] "" XXX - SG_ VS : 48|8@1+ (1,0) [0|0] "" XXX - -BO_ 809 EMS12: 8 XXX - SG_ ACC_ACT : 30|1@1+ (1,0) [0|0] "" XXX - SG_ ACK_ES : 25|1@1+ (1,0) [0|0] "" XXX - SG_ BRAKE_ACT : 32|2@1+ (1,0) [0|0] "" XXX - SG_ CAN_VERS : 0|6@1+ (1,0) [0|0] "" XXX - SG_ CLU_ACK : 31|1@1+ (1,0) [0|0] "" XXX - SG_ CONF_MIL_FMY : 26|3@1+ (1,0) [0|0] "" XXX - SG_ CONF_TCU : 0|6@1+ (1,0) [0|0] "" XXX - SG_ ENG_CHR : 34|4@1+ (1,0) [0|0] "" XXX - SG_ ENG_VOL : 56|8@1+ (0.1,0) [0|0] "" XXX - SG_ GP_CTL : 38|2@1+ (1,0) [0|0] "" XXX - SG_ MAF_FAC_ALTI_MMV : 16|8@1+ (0.00781,0) [0|0] "" XXX - SG_ MUL_CODE : 6|2@1+ (1,0) [0|0] "" XXX - SG_ OBD_FRF_ACK : 0|6@1+ (1,0) [0|0] "" XXX - SG_ OD_OFF_REQ : 29|1@1+ (1,0) [0|0] "" XXX - SG_ PV_AV_CAN : 48|8@1+ (0.3906,0) [0|0] "" XXX - SG_ TEMP_ENG : 8|8@1+ (0.75,-48) [0|0] "" XXX - SG_ TPS : 40|8@1+ (0.4694836,-15.0234742) [0|0] "" XXX - SG_ TQ_STND : 0|6@1+ (10,0) [0|0] "" XXX - SG_ VB_OFF_ACT : 24|1@1+ (1,0) [0|0] "" XXX - -BO_ 832 LKAS11: 8 XXX - SG_ CF_Lkas_ActToi : 27|1@1+ (1.0,0.0) [0.0|1.0] "" MDPS - SG_ CF_Lkas_Chksum : 0|8@1+ (1.0,0.0) [0.0|255.0] "" MDPS - SG_ CF_Lkas_FcwOpt_USM : 32|3@1+ (1.0,0.0) [0.0|7.0] "" CLU - SG_ CF_Lkas_LdwsActivemode : 30|2@1+ (1,0) [0|3] "" CLU,IBOX,PSB - SG_ CF_Lkas_LdwsLHWarning : 12|2@1+ (1.0,0.0) [0.0|3.0] "" BCM,CLU,PSB - SG_ CF_Lkas_LdwsRHWarning : 10|2@1+ (1.0,0.0) [0.0|3.0] "" BCM,CLU,PSB - SG_ CF_Lkas_MsgCount : 36|4@1+ (1.0,0.0) [0.0|15.0] "" CLU,MDPS - SG_ CF_Lkas_ToiFlt : 28|1@1+ (1.0,0.0) [0.0|1.0] "" MDPS - SG_ CR_Lkas_StrToqReq : 16|11@1+ (1.0,-1024.0) [-1024.0|1024.0] "" MDPS - SG_ NEW_SIGNAL_1 : 8|2@1+ (1,0) [0|0] "" XXX - SG_ NEW_SIGNAL_2 : 14|2@1+ (1,0) [0|0] "" XXX - SG_ NEW_SIGNAL_3 : 29|1@0+ (1,0) [0|0] "" XXX - SG_ NEW_SIGNAL_4 : 35|1@0+ (1,0) [0|0] "" XXX - SG_ NEW_SIGNAL_5 : 40|8@1+ (1,0) [0|0] "" XXX - SG_ NEW_SIGNAL_6 : 48|8@1+ (1,0) [0|0] "" XXX - SG_ NEW_SIGNAL_7 : 56|8@1+ (1,0) [0|0] "" XXX - -BO_ 854 M_356: 8 XXX - SG_ PAINT1 : 32|1@0+ (1,0) [0|0] "" XXX - SG_ PAINT2 : 34|2@0+ (1,0) [0|0] "" XXX - SG_ PAINT3 : 36|2@0+ (1,0) [0|0] "" XXX - SG_ PAINT4 : 38|1@0+ (1,0) [0|0] "" XXX - -BO_ 867 RADAR_0x363: 8 XXX - SG_ _CHECKSUM : 0|8@1+ (1,0) [0|0] "" XXX - SG_ COUNTER : 12|4@1+ (1,0) [0|0] "" XXX - SG_ FCA_ESA : 8|2@1+ (1,0) [0|3] "" XXX - SG_ BYTE2 : 16|8@1+ (1,0) [0|0] "" XXX - SG_ BYTE3 : 24|8@1+ (1,0) [0|0] "" XXX - SG_ BYTE4 : 32|8@1+ (1,0) [0|0] "" XXX - SG_ BYTE5 : 40|8@1+ (1,0) [0|0] "" XXX - SG_ BYTE6 : 48|8@1+ (1,0) [0|0] "" XXX - SG_ BYTE7 : 56|8@1+ (1,0) [0|0] "" XXX - -BO_ 870 EMS_366: 8 XXX - SG_ N : 8|16@1+ (0.25,0) [0|0] "" XXX - SG_ SWI_IGK : 48|1@0+ (1,0) [0|0] "" XXX - SG_ TQI_1 : 0|8@1+ (0.390625,0) [0|0] "" XXX - SG_ TQI_2 : 24|8@1+ (0.390625,0) [0|0] "" XXX - SG_ VS : 40|8@1+ (1,0) [0|0] "" XXX - -BO_ 871 LVR12: 8 XXX - SG_ CF_Lvr_CruiseSet : 0|8@1+ (1,0) [0|0] "" XXX - SG_ CF_Lvr_Gear : 32|4@1+ (1,0) [0|0] "" XXX - -BO_ 872 LVR11: 8 XXX - SG_ CF_Lvr_AC : 48|4@1+ (1,0) [0|0] "" XXX - SG_ CF_Lvr_BkeAct : 5|1@1+ (1,0) [0|0] "" XXX - SG_ CF_Lvr_CS : 52|4@1+ (1,0) [0|0] "" XXX - SG_ CF_Lvr_GearInf : 0|4@1+ (1,0) [0|0] "" XXX - SG_ CF_Lvr_NFnStat : 6|1@1+ (1,0) [0|0] "" XXX - SG_ CF_Lvr_PNStat : 20|2@1+ (1,0) [0|0] "" XXX - SG_ CF_Lvr_PRelStat : 4|1@1+ (1,0) [0|0] "" XXX - SG_ CF_Lvr_PosCpl : 12|4@1+ (1,0) [0|0] "" XXX - SG_ CF_Lvr_PosInf : 8|4@1+ (1,0) [0|0] "" XXX - SG_ CF_Lvr_ShfErrInf : 28|20@1+ (1,0) [0|0] "" XXX - SG_ CF_Lvr_ShtLkStat : 24|4@1+ (1,0) [0|0] "" XXX - SG_ CF_Lvr_UlkButStat : 18|2@1+ (1,0) [0|0] "" XXX - -BO_ 897 MDPS11: 8 XXX - SG_ CF_MDPS_VSM_FUNC : 56|1@0+ (1,0) [0|0] "" XXX - SG_ CF_Mdps_ALTRequest : 23|1@1+ (1,0) [0|0] "" XXX - SG_ CF_Mdps_AliveCnt : 40|8@1+ (1,0) [0|0] "" XXX - SG_ CF_Mdps_Chksum : 48|8@1+ (1,0) [0|0] "" XXX - SG_ CF_Mdps_CurrMode : 59|2@1+ (1,0) [0|0] "" XXX - SG_ CF_Mdps_Flex : 2|3@1+ (1,0) [0|0] "" XXX - SG_ CF_Mdps_FlexDisp : 5|1@1+ (1,0) [0|0] "" XXX - SG_ CF_Mdps_LKAS_FUNC : 58|1@1+ (1,0) [0|0] "" XXX - SG_ CF_Mdps_SPAS_FUNC : 57|1@1+ (1,0) [0|0] "" XXX - SG_ CF_Mdps_Stat : 7|4@1+ (1,0) [0|0] "" XXX - SG_ CF_Mdps_Type : 61|2@1+ (1,0) [0|0] "" XXX - SG_ CF_Mdps_WLmp : 0|2@1+ (1,0) [0|0] "" XXX - SG_ CR_Mdps_DrvTq : 11|12@1+ (1,-2048) [0|0] "" XXX - SG_ CR_Mdps_StrAng : 24|16@1- (0.1,0) [0|0] "" XXX - -BO_ 902 WHL_SPD11: 8 XXX - SG_ WHL_SPD_AliveCounter_LSB : 14|2@1+ (1,0) [0|0] "" XXX - SG_ WHL_SPD_AliveCounter_MSB : 30|2@1+ (1,0) [0|0] "" XXX - SG_ WHL_SPD_Checksum_LSB : 46|2@1+ (1,0) [0|0] "" XXX - SG_ WHL_SPD_Checksum_MSB : 62|2@1+ (1,0) [0|0] "" XXX - SG_ WHL_SPD_FL : 0|14@1+ (0.03125,0) [0|0] "" XXX - SG_ WHL_SPD_FR : 16|14@1+ (0.03125,0) [0|0] "" XXX - SG_ WHL_SPD_RL : 32|14@1+ (0.03125,0) [0|0] "" XXX - SG_ WHL_SPD_RR : 48|14@1+ (0.03125,0) [0|0] "" XXX - -BO_ 903 WHL_PUL11: 6 XXX - SG_ WHL_DIR_FL : 32|2@1+ (1,0) [0|0] "" XXX - SG_ WHL_DIR_FR : 34|2@1+ (1,0) [0|0] "" XXX - SG_ WHL_DIR_RL : 36|2@1+ (1,0) [0|0] "" XXX - SG_ WHL_DIR_RR : 38|2@1+ (1,0) [0|0] "" XXX - SG_ WHL_PUL_Chksum : 40|8@1+ (1,0) [0|0] "" XXX - SG_ WHL_PUL_FL : 0|8@1+ (0.5,0) [0|0] "" XXX - SG_ WHL_PUL_FR : 8|8@1+ (0.5,0) [0|0] "" XXX - SG_ WHL_PUL_RL : 16|8@1+ (0.5,0) [0|0] "" XXX - SG_ WHL_PUL_RR : 24|8@1+ (0.5,0) [0|0] "" XXX - -BO_ 905 SCC14: 8 XXX - SG_ ACC_ObjLatPos : 16|9@1+ (0.1,-20) [-20|31.1] "m" ABS,ESC - SG_ _CHECKSUM : 0|8@1+ (1,0) [0|0] "" XXX - SG_ COUNTER : 12|4@1+ (1,0) [0|0] "" XXX - SG_ ObjGap : 51|3@1+ (1,0) [0|255] "" CLU,HUD,ESC - -BO_ 909 FCA11: 8 XXX - SG_ CR_FCA_ChkSum : 0|8@1+ (1,0) [0|0] "" XXX - SG_ NEW_SIGNAL_1 : 8|4@1+ (1,0) [0|0] "" XXX - SG_ CR_FCA_Alive : 12|4@1+ (1,0) [0|0] "" XXX - SG_ BYTE2 : 16|8@1+ (1,0) [0|0] "" XXX - SG_ BYTE3 : 24|8@1+ (1,0) [0|0] "" XXX - SG_ BYTE4 : 32|8@1+ (1,0) [0|0] "" XXX - SG_ BYTE5 : 40|8@1+ (1,0) [0|0] "" XXX - SG_ BYTE6 : 48|8@1+ (1,0) [0|0] "" XXX - SG_ BYTE7 : 56|8@1+ (1,0) [0|0] "" XXX - -BO_ 913 BCM_PO_11: 8 XXX - SG_ BCM_Door_Dri_Status : 5|1@0+ (1,0) [0|0] "" XXX - SG_ BCM_Shift_R_MT_SW_Status : 39|2@0+ (1,0) [0|0] "" XXX - SG_ LFA_Pressed : 4|1@0+ (1,0) [0|0] "" XXX - -BO_ 916 TCS13: 8 XXX - SG_ ACCEL_REF_ACC : 32|11@1+ (0.01,-10.23) [0|0] "" XXX - SG_ ACCEnable : 43|2@1+ (1,0) [0|0] "" XXX - SG_ ACC_EQUIP : 52|1@1+ (1,0) [0|0] "" XXX - SG_ ACC_REQ : 54|1@1+ (1,0) [0|0] "" XXX - SG_ AEB_EQUIP : 63|1@1+ (1,0) [0|0] "" XXX - SG_ AliveCounterTCS : 13|3@1+ (1,0) [0|0] "" XXX - SG_ BrakeLight : 11|1@1+ (1,0) [0|0] "" XXX - SG_ CF_DriBkeStat : 60|1@1+ (1,0) [0|0] "" XXX - SG_ CF_VSM_Avail : 57|2@1+ (1,0) [0|0] "" XXX - SG_ CF_VSM_Coded : 56|1@1+ (1,0) [0|0] "" XXX - SG_ CF_VSM_ConfSwi : 61|2@1+ (1,0) [0|0] "" XXX - SG_ CF_VSM_Handshake : 59|1@1+ (1,0) [0|0] "" XXX - SG_ CheckSum_TCS3 : 48|4@1+ (1,0) [0|0] "" XXX - SG_ DCEnable : 12|1@1+ (1,0) [0|0] "" XXX - SG_ DF_BF_STAT : 19|2@1+ (1,0) [0|0] "" XXX - SG_ DriverBraking : 55|1@1+ (1,0) [0|0] "" XXX - SG_ DriverOverride : 45|2@1+ (1,0) [0|0] "" XXX - SG_ EBA_ACK : 17|1@1+ (1,0) [0|0] "" XXX - SG_ FCA_ACK : 18|1@1+ (1,0) [0|0] "" XXX - SG_ PBRAKE_ACT : 53|1@1+ (1,0) [0|0] "" XXX - SG_ Pre_TCS_CTL : 16|1@1+ (1,0) [0|0] "" XXX - SG_ SCCReqLim : 22|2@1+ (1,0) [0|0] "" XXX - SG_ StandStill : 47|1@1+ (1,0) [0|0] "" XXX - SG_ TQI_SCC : 24|8@1+ (0.390625,0) [0|0] "" XXX - SG_ aBasis : 0|11@1+ (0.01,-10.23) [0|0] "" XXX - -BO_ 920 RADAR_0x398: 8 XXX - SG_ _CHECKSUM : 0|8@1+ (1,0) [0|0] "" XXX - SG_ NEW_SIGNAL_1 : 8|4@1+ (1,0) [0|0] "" XXX - SG_ COUNTER : 12|4@1+ (1,0) [0|0] "" XXX - SG_ BYTE2 : 16|8@1+ (1,0) [0|0] "" XXX - SG_ BYTE3 : 24|8@1+ (1,0) [0|0] "" XXX - SG_ BYTE4 : 32|8@1+ (1,0) [0|0] "" XXX - SG_ BYTE5 : 40|8@1+ (1,0) [0|0] "" XXX - SG_ BYTE6 : 48|8@1+ (1,0) [0|0] "" XXX - SG_ BYTE7 : 56|8@1+ (1,0) [0|0] "" XXX - -BO_ 921 RADAR_0x399: 8 XXX - SG_ _CHECKSUM : 0|8@1+ (1,0) [0|0] "" XXX - SG_ NEW_SIGNAL_1 : 8|4@1+ (1,0) [0|0] "" XXX - SG_ COUNTER : 12|4@1+ (1,0) [0|0] "" XXX - SG_ BYTE2 : 16|8@1+ (1,0) [0|0] "" XXX - SG_ BYTE3 : 24|8@1+ (1,0) [0|0] "" XXX - SG_ BYTE4 : 32|8@1+ (1,0) [0|0] "" XXX - SG_ BYTE5 : 40|8@1+ (1,0) [0|0] "" XXX - SG_ BYTE6 : 48|8@1+ (1,0) [0|0] "" XXX - SG_ BYTE7 : 56|8@1+ (1,0) [0|0] "" XXX - -BO_ 922 RADAR_0x39a: 8 XXX - SG_ _CHECKSUM : 0|8@1+ (1,0) [0|0] "" XXX - SG_ NEW_SIGNAL_1 : 8|4@1+ (1,0) [0|0] "" XXX - SG_ COUNTER : 12|4@1+ (1,0) [0|0] "" XXX - SG_ BYTE2 : 16|8@1+ (1,0) [0|0] "" XXX - SG_ BYTE3 : 24|8@1+ (1,0) [0|0] "" XXX - SG_ BYTE4 : 32|8@1+ (1,0) [0|0] "" XXX - SG_ BYTE5 : 40|8@1+ (1,0) [0|0] "" XXX - SG_ BYTE6 : 48|8@1+ (1,0) [0|0] "" XXX - SG_ BYTE7 : 56|8@1+ (1,0) [0|0] "" XXX - -BO_ 923 RADAR_0x39b: 8 XXX - SG_ _CHECKSUM : 0|8@1+ (1,0) [0|0] "" XXX - SG_ NEW_SIGNAL_1 : 8|4@1+ (1,0) [0|0] "" XXX - SG_ COUNTER : 12|4@1+ (1,0) [0|0] "" XXX - SG_ BYTE2 : 16|8@1+ (1,0) [0|0] "" XXX - SG_ BYTE3 : 24|8@1+ (1,0) [0|0] "" XXX - SG_ BYTE4 : 32|8@1+ (1,0) [0|0] "" XXX - SG_ BYTE5 : 40|8@1+ (1,0) [0|0] "" XXX - SG_ BYTE6 : 48|8@1+ (1,0) [0|0] "" XXX - SG_ BYTE7 : 56|8@1+ (1,0) [0|0] "" XXX - -BO_ 924 RADAR_0x39c: 8 XXX - SG_ _CHECKSUM : 0|8@1+ (1,0) [0|0] "" XXX - SG_ NEW_SIGNAL_1 : 8|4@1+ (1,0) [0|0] "" XXX - SG_ COUNTER : 12|4@1+ (1,0) [0|0] "" XXX - SG_ BYTE2 : 16|8@1+ (1,0) [0|0] "" XXX - SG_ BYTE3 : 24|8@1+ (1,0) [0|0] "" XXX - SG_ BYTE4 : 32|8@1+ (1,0) [0|0] "" XXX - SG_ BYTE5 : 40|8@1+ (1,0) [0|0] "" XXX - SG_ BYTE6 : 48|8@1+ (1,0) [0|0] "" XXX - SG_ BYTE7 : 56|8@1+ (1,0) [0|0] "" XXX - -BO_ 1040 CGW_USM1: 8 XXX - SG_ CF_Gway_ADrLRValue : 8|3@1+ (1,0) [0|0] "" XXX - SG_ CF_Gway_ADrURValue : 11|3@1+ (1,0) [0|0] "" XXX - SG_ CF_Gway_ATTurnRValue : 0|2@1+ (1,0) [0|0] "" XXX - SG_ CF_Gway_AutoLightRValue : 35|3@1+ (1,0) [0|0] "" XXX - SG_ CF_Gway_DrLockSoundRValue : 24|3@1+ (1,0) [0|0] "" XXX - SG_ CF_Gway_EscortHLRValue : 4|2@1+ (1,0) [0|0] "" XXX - SG_ CF_Gway_HAnBRValue : 27|3@1+ (1,0) [0|0] "" XXX - SG_ CF_Gway_HfreeTrunkRValue : 32|3@1+ (1,0) [0|0] "" XXX - SG_ CF_Gway_MoodLpRValue : 30|2@1+ (1,0) [0|0] "" XXX - SG_ CF_Gway_OTTurnRValue : 21|3@1+ (1,0) [0|0] "" XXX - SG_ CF_Gway_PSMRValue : 18|3@1+ (1,0) [0|0] "" XXX - SG_ CF_Gway_PTGMRValue : 2|2@1+ (1,0) [0|0] "" XXX - SG_ CF_Gway_PasSpkrLvRValue : 40|3@1+ (1,0) [0|0] "" XXX - SG_ CF_Gway_RearWiperRValue : 38|2@1+ (1,0) [0|0] "" XXX - SG_ CF_Gway_SCMRValue : 14|2@1+ (1,0) [0|0] "" XXX - SG_ CF_Gway_TTUnlockRValue : 6|2@1+ (1,0) [0|0] "" XXX - SG_ CF_Gway_WlightRValue : 16|2@1+ (1,0) [0|0] "" XXX - -BO_ 1042 ICM_412h: 8 XXX - SG_ PopupMessageOutput_1Level : 48|1@0+ (1,0) [0|0] "" XXX - SG_ PopupMessageOutput_2Level : 49|1@0+ (1,0) [0|0] "" XXX - SG_ PopupMessageOutput_3Level : 50|1@0+ (1,0) [0|0] "" XXX - SG_ PopupMessageOutput_4Level : 51|1@0+ (1,0) [0|0] "" XXX - SG_ PopupMessageOutput_5Level : 52|1@0+ (1,0) [0|0] "" XXX - SG_ PopupMessageOutput_6Level : 53|1@0+ (1,0) [0|0] "" XXX - SG_ PopupMessageOutput_7Level : 54|1@0+ (1,0) [0|0] "" XXX - SG_ PopupMessageOutput_8Level : 55|1@0+ (1,0) [0|0] "" XXX - SG_ TRIP_A_DT_Display_clock : 22|7@0+ (1,0) [0|0] "" XXX - SG_ TRIP_A_DT_Display_minute : 29|6@0+ (1,0) [0|0] "" XXX - SG_ TRIP_B_DT_Display_clock : 38|7@0+ (1,0) [0|0] "" XXX - SG_ TRIP_B_DT_Display_minute : 45|6@0+ (1,0) [0|0] "" XXX - SG_ T_Outside_input : 0|9@0+ (0.01,0) [0|0] "" XXX - SG_ WarningSoundOutput_1Group : 5|1@0+ (1,0) [0|0] "" XXX - SG_ WarningSoundOutput_2Group : 6|1@0+ (1,0) [0|0] "" XXX - SG_ WarningSoundOutput_3Group : 7|1@0+ (1,0) [0|0] "" XXX - -BO_ 1056 SCC11: 8 XXX - SG_ _CHECKSUM : 0|8@1+ (1,0) [0|0] "" XXX - SG_ AliveCounterACC : 12|4@1+ (1,0) [0|15] "" CLU,EMS,ESC,TCU - SG_ JerkLowerLimit : 50|7@1+ (0.1,0) [0|12.7] "m/s^3" ESC - SG_ JerkUpperLimit : 43|7@1+ (0.1,0) [0|12.7] "m/s^3" ESC - SG_ ObjValid : 59|1@1+ (1,0) [0|1] "" CLU,ESC,TCU - SG_ aReqRaw : 27|11@1+ (0.01,-10.23) [-10.23|10.24] "m/s^2" Vector__XXX - SG_ aReqValue : 16|11@1+ (0.01,-10.23) [-10.23|10.24] "m/s^2" Vector__XXX - -BO_ 1057 SCC12: 8 XXX - SG_ ACCMode : 28|2@1+ (1,0) [0|3] "" CLU,HUD,LDWS_LKAS,ESC - SG_ ACCMode_Inactive : 30|1@1+ (1,0) [0|1] "" CLU,HUD,LDWS_LKAS,ESC - SG_ ACC_ObjDist : 16|11@1+ (0.1,0) [0|204.7] "m" ABS,ESC - SG_ CR_VSM_ChkSum : 0|8@1+ (1,0) [0|0] "" XXX - SG_ CR_VSM_Alive : 12|4@1+ (1,0) [0|15] "" ESC,PSB - SG_ MainMode_ACC : 27|1@1+ (1,0) [0|1] "" CLU,EMS,ESC - SG_ SCCInfoDisplay : 32|3@1+ (1,0) [0|7] "" CLU,ESC - SG_ TauGapSet : 37|3@1+ (1,0) [0|7] "" CLU,ESC,TCU - SG_ VSetDis : 41|8@1+ (1,0) [0|255] "km/h or MPH" CLU,ESC,TCU - SG_ StopReq : 49|1@1+ (1,0) [0|1] "" EPB,ESC - -BO_ 1064 _4WD11: 8 XXX - SG_ AUTO_ACT : 43|1@1+ (1,0) [0|0] "" XXX - SG_ CLU_DUTY : 16|8@1+ (1,0) [0|0] "" XXX - SG_ LOCK_ACT : 44|1@1+ (1,0) [0|0] "" XXX - SG_ LOW_ACT : 42|1@1+ (1,0) [0|0] "" XXX - SG_ R_TIRE : 24|8@1+ (1,200) [0|0] "" XXX - SG_ _2H_ACT : 40|1@1+ (1,0) [0|0] "" XXX - SG_ _4H_ACT : 41|1@1+ (1,0) [0|0] "" XXX - SG_ _4WD_ERR : 8|8@1+ (1,0) [0|0] "" XXX - SG_ _4WD_SUPPORT : 2|2@1+ (1,0) [0|0] "" XXX - SG_ _4WD_SW : 32|8@1+ (1,0) [0|0] "" XXX - SG_ _4WD_TQC_CUR : 48|16@1+ (1,0) [0|0] "" XXX - SG_ _4WD_TYPE : 0|2@1+ (1,0) [0|0] "" XXX - -BO_ 1078 PAS11: 4 XXX - SG_ CF_Gway_PASCheckSound : 22|2@1+ (1,0) [0|0] "" XXX - SG_ CF_Gway_PASDisplayFCTR : 8|3@1+ (1,0) [0|0] "" XXX - SG_ CF_Gway_PASDisplayFLH : 0|3@1+ (1,0) [0|0] "" XXX - SG_ CF_Gway_PASDisplayFRH : 3|3@1+ (1,0) [0|0] "" XXX - SG_ CF_Gway_PASDisplayRCTR : 11|3@1+ (1,0) [0|0] "" XXX - SG_ CF_Gway_PASDisplayRLH : 16|3@1+ (1,0) [0|0] "" XXX - SG_ CF_Gway_PASDisplayRRH : 19|3@1+ (1,0) [0|0] "" XXX - SG_ CF_Gway_PASDistance : 28|1@1+ (1,0) [0|0] "" XXX - SG_ CF_Gway_PASFsound : 14|2@1+ (1,0) [0|0] "" XXX - SG_ CF_Gway_PASOption : 26|2@1+ (1,0) [0|0] "" XXX - SG_ CF_Gway_PASRsound : 6|2@1+ (1,0) [0|0] "" XXX - SG_ CF_Gway_PASSystemOn : 24|2@1+ (1,0) [0|0] "" XXX - -BO_ 1082 RADAR_0x43a: 8 XXX - SG_ _CHECKSUM : 0|8@1+ (1,0) [0|0] "" XXX - SG_ NEW_SIGNAL_1 : 8|4@1+ (1,0) [0|0] "" XXX - SG_ COUNTER : 12|4@1+ (1,0) [0|0] "" XXX - SG_ BYTE2 : 16|8@1+ (1,0) [0|0] "" XXX - SG_ BYTE3 : 24|8@1+ (1,0) [0|0] "" XXX - SG_ BYTE4 : 32|8@1+ (1,0) [0|0] "" XXX - SG_ BYTE5 : 40|8@1+ (1,0) [0|0] "" XXX - SG_ BYTE6 : 48|8@1+ (1,0) [0|0] "" XXX - SG_ BYTE7 : 56|8@1+ (1,0) [0|0] "" XXX - -BO_ 1136 P_STS: 8 XXX - SG_ Checksum : 62|2@1+ (1,0) [0|0] "" XXX - SG_ Counter : 58|4@1+ (1,0) [0|0] "" XXX - SG_ HCU1_STS : 6|2@1+ (1,0) [0|0] "" XXX - SG_ HCU5_STS : 8|2@1+ (1,0) [0|0] "" XXX - -BO_ 1151 ESP11: 6 XXX - SG_ AVH_STAT : 0|2@1+ (1,0) [0|0] "" XXX - SG_ ECD_ACT : 6|1@1+ (1,0) [0|0] "" XXX - SG_ LDM_STAT : 2|1@1+ (1,0) [0|0] "" XXX - SG_ REQ_EPB_ACT : 3|2@1+ (1,0) [0|0] "" XXX - SG_ REQ_EPB_STAT : 5|1@1+ (1,0) [0|0] "" XXX - SG_ ROL_CNT_ESP : 8|8@1+ (1,0) [0|0] "" XXX - SG_ _4WD_CLU_LIM : 32|8@1+ (0.390625,0) [0|0] "" XXX - SG_ _4WD_LIM_MODE : 42|1@1+ (1,0) [0|0] "" XXX - SG_ _4WD_LIM_REQ : 7|1@1+ (1,0) [0|0] "" XXX - SG_ _4WD_OPEN : 40|2@1+ (1,0) [0|0] "" XXX - SG_ _4WD_TQC_LIM : 16|16@1+ (1,0) [0|0] "" XXX - -BO_ 1157 LFAHDA_MFC: 8 XXX - SG_ _CHECKSUM : 0|8@1+ (1,0) [0|0] "" XXX - SG_ NEW_SIGNAL_1 : 8|4@1+ (1,0) [0|0] "" XXX - SG_ COUNTER : 12|4@1+ (1,0) [0|0] "" XXX - SG_ NEW_SIGNAL_2 : 16|1@0+ (1,0) [0|0] "" XXX - SG_ NEW_SIGNAL_3 : 17|1@0+ (1,0) [0|0] "" XXX - SG_ NEW_SIGNAL_4 : 18|1@0+ (1,0) [0|0] "" XXX - SG_ HDA_Icon_State : 19|2@1+ (1,0) [0|0] "" XXX - SG_ NEW_SIGNAL_5 : 21|3@1+ (1,0) [0|0] "" XXX - SG_ NEW_SIGNAL_6 : 24|1@0+ (1,0) [0|0] "" XXX - SG_ LFA_Icon_State : 25|2@1+ (1,0) [0|0] "" XXX - SG_ NEW_SIGNAL_7 : 27|37@1+ (1,0) [0|0] "" XXX - -BO_ 1162 BCA11: 8 XXX - SG_ AliveCounter : 21|4@1+ (1,0) [0|0] "" XXX - SG_ CF_BCA_State : 16|3@1+ (1,0) [0|0] "" XXX - SG_ CF_BCA_Warning : 19|2@1+ (1,0) [0|0] "" XXX - SG_ Check_Sum : 56|8@1+ (1,0) [0|0] "" XXX - SG_ RCCA_Brake_Command : 29|1@1+ (1,0) [0|0] "" XXX - -BO_ 1168 EPB11: 7 XXX - SG_ EPB_ALARM : 6|2@1+ (1,0) [0|0] "" XXX - SG_ EPB_CLU : 8|8@1+ (1,0) [0|0] "" XXX - SG_ EPB_DBF_DECEL : 48|8@1+ (0.01,0) [0|0] "" XXX - SG_ EPB_DBF_REQ : 26|1@1+ (1,0) [0|0] "" XXX - SG_ EPB_DBF_STAT : 24|1@1+ (1,0) [0|0] "" XXX - SG_ EPB_FAIL : 29|3@1+ (1,0) [0|0] "" XXX - SG_ EPB_FORCE : 32|12@1+ (1,-1000) [0|0] "" XXX - SG_ EPB_FRC_ERR : 22|2@1+ (1,0) [0|0] "" XXX - SG_ EPB_F_LAMP : 4|2@1+ (1,0) [0|0] "" XXX - SG_ EPB_I_LAMP : 0|4@1+ (1,0) [0|0] "" XXX - SG_ EPB_RBL : 18|1@1+ (1,0) [0|0] "" XXX - SG_ EPB_STATUS : 19|3@1+ (1,0) [0|0] "" XXX - SG_ EPB_SWITCH : 16|2@1+ (1,0) [0|0] "" XXX - SG_ ESP_ACK : 25|1@1+ (1,0) [0|0] "" XXX - -BO_ 1170 EMS19: 8 XXX - SG_ BAT_LAMP_STAT : 42|1@1+ (1,0) [0|0] "" XXX - SG_ CF_Ems_AAFOpenReq : 7|1@1+ (1,0) [0|0] "" XXX - SG_ CF_Ems_AliveCounterEMS9 : 58|2@1+ (1,0) [0|0] "" XXX - SG_ CF_Ems_BrkReq : 0|1@1+ (1,0) [0|0] "" XXX - SG_ CF_Ems_ChecksumEMS9 : 60|4@1+ (1,0) [0|0] "" XXX - SG_ CF_Ems_DecelReq : 8|12@1+ (0.001,-4.094) [0|0] "" XXX - SG_ CF_Ems_DnShftReq : 1|4@1+ (1,0) [0|0] "" XXX - SG_ CF_Ems_ModeledAmbTemp : 48|8@1+ (0.5,-41) [0|0] "" XXX - SG_ CF_Ems_OPSFail : 56|1@1+ (1,0) [0|0] "" XXX - SG_ CF_Ems_RepModChk : 5|2@1+ (1,0) [0|0] "" XXX - SG_ CR_Ems_BstPre : 20|12@1+ (1.322,0) [0|0] "" XXX - SG_ CR_Ems_EngOilTemp : 32|8@1+ (0.75,-40) [0|0] "" XXX - SG_ DPF_LAMP_STAT : 40|2@1+ (1,0) [0|0] "" XXX - -BO_ 1173 YRS13: 8 XXX - SG_ YRS_SeralNo : 16|48@1+ (1,0) [0|0] "" XXX - -BO_ 1186 FRT_RADAR11: 2 XXX - SG_ BYTE0 : 0|8@1+ (1,0) [0|0] "" XXX - SG_ BYTE1 : 8|8@1+ (1,0) [0|0] "" XXX - SG_ BYTE2 : 16|8@1+ (1,0) [0|0] "" XXX - SG_ BYTE3 : 24|8@1+ (1,0) [0|0] "" XXX - SG_ BYTE4 : 32|8@1+ (1,0) [0|0] "" XXX - SG_ BYTE5 : 40|8@1+ (1,0) [0|0] "" XXX - SG_ BYTE6 : 48|8@1+ (1,0) [0|0] "" XXX - SG_ BYTE7 : 56|8@1+ (1,0) [0|0] "" XXX - -BO_ 1265 CLU11: 4 XXX - SG_ CF_Clu_AliveCnt1 : 28|4@1+ (1,0) [0|0] "" XXX - SG_ CF_Clu_AmpInfo : 25|1@1+ (1,0) [0|0] "" XXX - SG_ CF_Clu_CluInfo : 24|1@1+ (1,0) [0|0] "" XXX - SG_ CF_Clu_CruiseSwMain : 3|1@1+ (1,0) [0|0] "" XXX - SG_ CF_Clu_CruiseSwState : 0|3@1+ (1,0) [0|0] "" XXX - SG_ CF_Clu_DetentOut : 18|1@1+ (1,0) [0|0] "" XXX - SG_ CF_Clu_ParityBit1 : 5|1@1+ (1,0) [0|0] "" XXX - SG_ CF_Clu_RheostatLevel : 19|5@1+ (1,0) [0|0] "" XXX - SG_ CF_Clu_SPEED_UNIT : 17|1@1+ (1,0) [0|0] "" XXX - SG_ CF_Clu_SldMainSW : 4|1@1+ (1,0) [0|0] "" XXX - SG_ CF_Clu_Vanz : 8|9@1+ (0.5,0) [0|0] "" XXX - SG_ CF_Clu_VanzDecimal : 6|2@1+ (0.125,0) [0|0] "" XXX - -BO_ 1280 ACU14: 1 XXX - SG_ CF_SBR_Ind : 4|2@1+ (1,0) [0|0] "" XXX - SG_ CF_SWL_Ind : 0|2@1+ (1,0) [0|0] "" XXX - SG_ CF_TTL_Ind : 2|2@1+ (1,0) [0|0] "" XXX - -BO_ 1287 TCS15: 4 XXX - SG_ ABS_W_LAMP : 0|1@1+ (1,0) [0|0] "" XXX - SG_ AVH_ALARM : 27|2@1+ (1,0) [0|0] "" XXX - SG_ AVH_CLU : 16|8@1+ (1,0) [0|0] "" XXX - SG_ AVH_I_LAMP : 24|2@1+ (1,0) [0|0] "" XXX - SG_ AVH_LAMP : 29|3@1+ (1,0) [0|0] "" XXX - SG_ DBC_F_LAMP : 6|2@1+ (1,0) [0|0] "" XXX - SG_ DBC_W_LAMP : 5|1@1+ (1,0) [0|0] "" XXX - SG_ EBD_W_LAMP : 26|1@1+ (1,0) [0|0] "" XXX - SG_ ESC_Off_Step : 8|2@1+ (1,0) [0|0] "" XXX - SG_ TCS_LAMP : 3|2@1+ (1,0) [0|0] "" XXX - SG_ TCS_OFF_LAMP : 1|2@1+ (1,0) [0|0] "" XXX - -BO_ 1292 CLU13: 8 XXX - SG_ CF_Clu_ActiveEcoSW : 39|1@1+ (1,0) [0|0] "" XXX - SG_ CF_Clu_AliveCnt2 : 60|4@1+ (1,0) [0|0] "" XXX - SG_ CF_Clu_AltLStatus : 59|1@1+ (1,0) [0|0] "" XXX - SG_ CF_Clu_AvgFCI : 6|10@1+ (0.1,0) [0|0] "" XXX - SG_ CF_Clu_AvgFCU : 3|2@1+ (1,0) [0|0] "" XXX - SG_ CF_Clu_AvsmCur : 5|1@1+ (1,0) [0|0] "" XXX - SG_ CF_Clu_DTE : 24|10@1+ (1,0) [0|0] "" XXX - SG_ CF_Clu_DrivingModeSwi : 16|2@1+ (1,0) [0|0] "" XXX - SG_ CF_Clu_EcoDriveInf : 40|3@1+ (1,0) [0|0] "" XXX - SG_ CF_Clu_FlexSteerSW : 23|1@1+ (1,0) [0|0] "" XXX - SG_ CF_Clu_FuelDispLvl : 18|5@1+ (1,0) [0|0] "" XXX - SG_ CF_Clu_IsaMainSW : 43|1@1+ (1,0) [0|0] "" XXX - SG_ CF_Clu_LdwsLkasSW : 56|1@1+ (1,0) [0|0] "" XXX - SG_ CF_Clu_LowfuelWarn : 0|2@1+ (1,0) [0|0] "" XXX - SG_ CF_Clu_RefDetMod : 2|1@1+ (1,0) [0|0] "" XXX - SG_ CF_Clu_SWL_Stat : 36|3@1+ (1,0) [0|0] "" XXX - SG_ CF_Clu_TripUnit : 34|2@1+ (1,0) [0|0] "" XXX - -BO_ 1312 CGW3: 8 XXX - SG_ CF_Hoodsw_memory : 22|2@1+ (1,0) [0|0] "" XXX - SG_ CR_Photosensor_LH : 0|8@1+ (78.125,0) [0|0] "" XXX - SG_ CR_Photosensor_RH : 10|8@1+ (78.125,0) [0|0] "" XXX - SG_ C_MirOutTempSns : 24|8@1+ (0.5,-40.5) [0|0] "" XXX - -BO_ 1322 CLU15: 8 XXX - SG_ CF_Clu_ClusterSound : 38|1@1- (1,0) [0|0] "" XXX - SG_ CF_Clu_Gear : 9|4@1+ (1,0) [0|0] "" XXX - SG_ CF_Clu_HudBrightDnSW : 24|2@1+ (1,0) [0|0] "" XXX - SG_ CF_Clu_HudBrightUpSW : 22|2@1+ (1,0) [0|0] "" XXX - SG_ CF_Clu_HudFontColorSet : 20|2@1+ (1,0) [0|0] "" XXX - SG_ CF_Clu_HudFontSizeSet : 31|2@1+ (1,0) [0|0] "" XXX - SG_ CF_Clu_HudHeightDnSW : 28|2@1+ (1,0) [0|0] "" XXX - SG_ CF_Clu_HudHeightUpSW : 26|2@1+ (1,0) [0|0] "" XXX - SG_ CF_Clu_HudInfoSet : 13|7@1+ (1,0) [0|0] "" XXX - SG_ CF_Clu_HudSet : 30|1@1+ (1,0) [0|0] "" XXX - SG_ CF_Clu_LanguageInfo : 33|5@1+ (1,0) [0|0] "" XXX - SG_ CF_Clu_VehicleSpeed : 0|8@1+ (1,0) [0|0] "" XXX - SG_ CF_Clu_VehicleSpeed2 : 48|8@1+ (1,0) [0|0] "" XXX - -BO_ 1342 LKAS12: 8 XXX - SG_ CF_LkasDawStatus : 40|3@1+ (1,0) [0|0] "" XXX - SG_ CF_LkasTsrSpeed_Display_Navi : 24|8@1+ (1,0) [0|0] "" XXX - SG_ CF_Lkas_Daw_USM : 37|3@1+ (1,0) [0|0] "" XXX - SG_ CF_Lkas_TsrAddinfo_Display : 32|2@1+ (1,0) [0|0] "" XXX - SG_ CF_Lkas_TsrSlifOpt : 10|2@1+ (1,0) [0|0] "" XXX - SG_ CF_Lkas_TsrSpeed_Display_Clu : 16|8@1+ (1,0) [0|0] "" XXX - SG_ _CHECKSUM : 0|8@1+ (1,0) [0|0] "" XXX - SG_ COUNTER : 12|4@1+ (1,0) [0|0] "" XXX - -BO_ 1345 CGW1: 8 XXX - SG_ CF_Gway_ALightStat : 37|1@1+ (1,0) [0|0] "" XXX - SG_ CF_Gway_AstDrSw : 35|1@1+ (1,0) [0|0] "" XXX - SG_ CF_Gway_AstSeatBeltSw : 14|2@1+ (1,0) [0|0] "" XXX - SG_ CF_Gway_DefoggerRly : 36|1@1+ (1,0) [0|0] "" XXX - SG_ CF_Gway_DriveTypeOption : 43|1@1+ (1,0) [0|0] "" XXX - SG_ CF_Gway_DrvDrSw : 8|2@1+ (1,0) [0|0] "" XXX - SG_ CF_Gway_DrvKeyLockSw : 6|1@1+ (1,0) [0|0] "" XXX - SG_ CF_Gway_DrvKeyUnlockSw : 7|1@1+ (1,0) [0|0] "" XXX - SG_ CF_Gway_DrvSeatBeltSw : 10|2@1+ (1,0) [0|0] "" XXX - SG_ CF_Gway_Frt_Fog_Act : 40|1@1+ (1,0) [0|0] "" XXX - SG_ CF_Gway_HBAControlMode : 52|1@1+ (1,0) [0|0] "" XXX - SG_ CF_Gway_HLpHighSw : 53|1@1+ (1,0) [0|0] "" XXX - SG_ CF_Gway_HazardSw : 33|2@1+ (1,0) [0|0] "" XXX - SG_ CF_Gway_HeadLampHigh : 32|1@1+ (1,0) [0|0] "" XXX - SG_ CF_Gway_HeadLampLow : 31|1@1+ (1,0) [0|0] "" XXX - SG_ CF_Gway_HoodSw : 17|2@1+ (1,0) [0|0] "" XXX - SG_ CF_Gway_IGNSw : 0|3@1+ (1,0) [0|0] "" XXX - SG_ CF_Gway_Ign1 : 58|1@1+ (1,0) [0|0] "" XXX - SG_ CF_Gway_Ign2 : 59|1@1+ (1,0) [0|0] "" XXX - SG_ CF_Gway_InhibitRMT : 54|2@1+ (1,0) [0|0] "" XXX - SG_ CF_Gway_LightSwState : 38|2@1+ (1,0) [0|0] "" XXX - SG_ CF_Gway_ParkBrakeSw : 60|2@1+ (1,0) [0|0] "" XXX - SG_ CF_Gway_PassingSW : 51|1@1+ (1,0) [0|0] "" XXX - SG_ CF_Gway_PassiveAccessLock : 45|2@1+ (1,0) [0|0] "" XXX - SG_ CF_Gway_PassiveAccessUnlock : 48|2@1+ (1,0) [0|0] "" XXX - SG_ CF_Gway_RKECmd : 3|3@1+ (1,0) [0|0] "" XXX - SG_ CF_Gway_RainSnsOption : 56|1@1+ (1,0) [0|0] "" XXX - SG_ CF_Gway_RainSnsState : 28|3@1+ (1,0) [0|0] "" XXX - SG_ CF_Gway_RrSunRoofOpenState : 50|1@1+ (1,0) [0|0] "" XXX - SG_ CF_Gway_SMKOption : 16|1@1+ (1,0) [0|0] "" XXX - SG_ CF_Gway_StarterRlyState : 44|1@1+ (1,0) [0|0] "" XXX - SG_ CF_Gway_TSigLHSw : 42|1@1+ (1,0) [0|0] "" XXX - SG_ CF_Gway_TSigRHSw : 41|1@1+ (1,0) [0|0] "" XXX - SG_ CF_Gway_TrunkTgSw : 12|2@1+ (1,0) [0|0] "" XXX - SG_ CF_Gway_TurnSigLh : 19|2@1+ (1,0) [0|0] "" XXX - SG_ CF_Gway_TurnSigRh : 62|2@1+ (1,0) [0|0] "" XXX - SG_ CF_Gway_WiperAutoSw : 27|1@1+ (1,0) [0|0] "" XXX - SG_ CF_Gway_WiperHighSw : 26|1@1+ (1,0) [0|0] "" XXX - SG_ CF_Gway_WiperIntSw : 24|1@1+ (1,0) [0|0] "" XXX - SG_ CF_Gway_WiperIntT : 21|3@1+ (1,0) [0|0] "" XXX - SG_ CF_Gway_WiperLowSw : 25|1@1+ (1,0) [0|0] "" XXX - SG_ CF_Gway_WiperMistSw : 47|1@1+ (1,0) [0|0] "" XXX - SG_ C_SunRoofOpenState : 57|1@1+ (1,0) [0|0] "" XXX - -BO_ 1348 Navi_HU: 8 XXX - SG_ SpeedLim_Nav_Clu : 7|8@0+ (1,0) [0|0] "" XXX - -BO_ 1363 CGW2: 8 XXX - SG_ CF_Gway_AutoLightOption : 54|1@1+ (1,0) [0|0] "" XXX - SG_ CF_Gway_AutoLightValue : 16|1@1+ (1,0) [0|0] "" XXX - SG_ CF_Gway_AvTail : 20|1@1+ (1,0) [0|0] "" XXX - SG_ CF_Gway_BCMRKEID : 41|3@1+ (1,0) [0|0] "" XXX - SG_ CF_Gway_BrakeFluidSw : 17|1@1+ (1,0) [0|0] "" XXX - SG_ CF_Gway_CLUSwEnter : 15|1@1+ (1,0) [0|0] "" XXX - SG_ CF_Gway_CLUSwGroup : 13|1@1+ (1,0) [0|0] "" XXX - SG_ CF_Gway_CLUSwGuiCtrl : 10|3@1+ (1,0) [0|0] "" XXX - SG_ CF_Gway_CLUSwMode : 14|1@1+ (1,0) [0|0] "" XXX - SG_ CF_Gway_CountryCfg : 26|3@1+ (1,0) [0|0] "" XXX - SG_ CF_Gway_DDMDiagState : 1|1@1+ (1,0) [0|0] "" XXX - SG_ CF_Gway_DeactivationWarn : 45|1@1+ (1,0) [0|0] "" XXX - SG_ CF_Gway_DrvSeatBeltInd : 18|2@1+ (1,0) [0|0] "" XXX - SG_ CF_Gway_ESCLFailWarn : 35|1@1+ (1,0) [0|0] "" XXX - SG_ CF_Gway_ESCLNotLockedWarn : 36|1@1+ (1,0) [0|0] "" XXX - SG_ CF_Gway_ESCLNotUnlockWarn : 37|1@1+ (1,0) [0|0] "" XXX - SG_ CF_Gway_ExtTailAct : 22|1@1+ (1,0) [0|0] "" XXX - SG_ CF_Gway_GwayDiagState : 0|1@1+ (1,0) [0|0] "" XXX - SG_ CF_Gway_HLLowLHFail : 33|1@1+ (1,0) [0|0] "" XXX - SG_ CF_Gway_HLLowRHFail : 34|1@1+ (1,0) [0|0] "" XXX - SG_ CF_Gway_IDoutWarn : 38|1@1+ (1,0) [0|0] "" XXX - SG_ CF_Gway_IPMDiagState : 5|1@1+ (1,0) [0|0] "" XXX - SG_ CF_Gway_ImmoLp : 40|1@1+ (1,0) [0|0] "" XXX - SG_ CF_Gway_IntTailAct : 25|1@1+ (1,0) [0|0] "" XXX - SG_ CF_Gway_KeyBATDischargeWarn : 46|1@1+ (1,0) [0|0] "" XXX - SG_ CF_Gway_KeyoutLp : 56|1@1+ (1,0) [0|0] "" XXX - SG_ CF_Gway_LDMFail : 6|2@1+ (1,0) [0|0] "" XXX - SG_ CF_Gway_PSMDiagState : 3|1@1+ (1,0) [0|0] "" XXX - SG_ CF_Gway_RLDrSw : 24|1@1+ (1,0) [0|0] "" XXX - SG_ CF_Gway_RRDrSw : 23|1@1+ (1,0) [0|0] "" XXX - SG_ CF_Gway_RearFogAct : 21|1@1+ (1,0) [0|0] "" XXX - SG_ CF_Gway_SCMDiagState : 2|1@1+ (1,0) [0|0] "" XXX - SG_ CF_Gway_SJBDeliveryMode : 55|1@1+ (1,0) [0|0] "" XXX - SG_ CF_Gway_SJBDiagState : 4|1@1+ (1,0) [0|0] "" XXX - SG_ CF_Gway_SMKDispWarn : 57|4@1+ (1,0) [0|0] "" XXX - SG_ CF_Gway_SMKFobID : 48|3@1+ (1,0) [0|0] "" XXX - SG_ CF_Gway_SMKRKECmd : 51|3@1+ (1,0) [0|0] "" XXX - SG_ CF_Gway_SSBWarn : 47|1@1+ (1,0) [0|0] "" XXX - SG_ CF_Gway_VehicleNotPWarn : 44|1@1+ (1,0) [0|0] "" XXX - SG_ CF_Gway_WiperParkPosition : 32|1@1+ (1,0) [0|0] "" XXX - SG_ CF_Gway_WngBuz : 61|3@1+ (1,0) [0|0] "" XXX - -BO_ 1369 CGW4: 8 XXX - SG_ CF_Gway_AstSeatBeltInd : 38|2@1+ (1,0) [0|0] "" XXX - SG_ CF_Gway_AstWdwStat : 11|1@1+ (1,0) [0|0] "" XXX - SG_ CF_Gway_DrvSeatBeltInd : 36|2@1+ (1,0) [0|0] "" XXX - SG_ CF_Gway_DrvWdwStat : 8|1@1+ (1,0) [0|0] "" XXX - SG_ CF_Gway_IMSBuzzer : 15|1@1+ (1,0) [0|0] "" XXX - SG_ CF_Gway_MemoryEnable : 12|1@1+ (1,0) [0|0] "" XXX - SG_ CF_Gway_MemoryP1Cmd : 0|1@1+ (1,0) [0|0] "" XXX - SG_ CF_Gway_MemoryP2Cmd : 1|1@1+ (1,0) [0|0] "" XXX - SG_ CF_Gway_PBACKStop : 14|1@1+ (1,0) [0|0] "" XXX - SG_ CF_Gway_PBACKStopCmd : 13|1@1+ (1,0) [0|0] "" XXX - SG_ CF_Gway_PBackP1Cmd : 2|1@1+ (1,0) [0|0] "" XXX - SG_ CF_Gway_PBackP2Cmd : 3|1@1+ (1,0) [0|0] "" XXX - SG_ CF_Gway_PBackStopCmd : 5|1@1+ (1,0) [0|0] "" XXX - SG_ CF_Gway_RCSeatBeltInd : 40|2@1+ (1,0) [0|0] "" XXX - SG_ CF_Gway_RLSeatBeltInd : 42|2@1+ (1,0) [0|0] "" XXX - SG_ CF_Gway_RLWdwState : 9|1@1+ (1,0) [0|0] "" XXX - SG_ CF_Gway_RRSeatBeltInd : 44|2@1+ (1,0) [0|0] "" XXX - SG_ CF_Gway_RRWdwState : 10|1@1+ (1,0) [0|0] "" XXX - SG_ CF_Gway_RrWiperHighSw : 46|1@1+ (1,0) [0|0] "" XXX - SG_ CF_Gway_RrWiperLowSw : 47|1@1+ (1,0) [0|0] "" XXX - SG_ CF_Gway_StaticBendLhAct : 6|1@1+ (1,0) [0|0] "" XXX - SG_ CF_Gway_StaticBendRhAct : 7|1@1+ (1,0) [0|0] "" XXX - SG_ CF_Gway_StrgWhlHeatedState : 4|1@1+ (1,0) [0|0] "" XXX - -BO_ 1370 HU_AVM_PE_00: 8 XXX - SG_ HU_AVM_Status : 0|2@1+ (1,0) [0|0] "" XXX - -BO_ 1371 AVM_HU_PE_00: 8 XXX - SG_ AVM_Display_Message : 8|8@1+ (1,0) [0|0] "" XXX - SG_ AVM_FrontBtn_Type : 28|4@1+ (1,0) [0|0] "" XXX - SG_ AVM_HU_FrontViewPointOpt : 36|4@1+ (1,0) [0|0] "" XXX - SG_ AVM_HU_FrontView_Option : 44|4@1+ (1,0) [0|0] "" XXX - SG_ AVM_HU_RearView_Option : 40|4@1+ (1,0) [0|0] "" XXX - SG_ AVM_Option : 32|4@1+ (1,0) [0|0] "" XXX - SG_ AVM_ParkingAssist_BtnSts : 5|3@1+ (1,0) [0|0] "" XXX - SG_ AVM_ParkingAssist_Step : 24|4@1+ (1,0) [0|0] "" XXX - SG_ AVM_Popup_Msg : 16|4@1+ (1,0) [0|0] "" XXX - SG_ AVM_Ready : 20|4@1+ (1,0) [0|0] "" XXX - SG_ AVM_Version : 48|16@1+ (1,0) [0|0] "" XXX - SG_ AVM_View : 0|5@1+ (1,0) [0|0] "" XXX - -BO_ 1407 HU_MON_PE_01: 8 XXX - SG_ HU_Type : 0|8@1+ (1,0) [0|0] "" XXX - -BO_ 1419 LCA11: 8 XXX - SG_ CF_Lca_IndLeft : 29|1@1+ (1,0) [0|0] "" XXX - SG_ CF_Lca_IndRight : 37|1@1+ (1,0) [0|0] "" XXX - -BO_ 1427 TPMS11: 6 XXX - SG_ POS_FL_W_LAMP : 4|1@1+ (1,0) [0|0] "" XXX - SG_ POS_FR_W_LAMP : 5|1@1+ (1,0) [0|0] "" XXX - SG_ POS_RL_W_LAMP : 6|1@1+ (1,0) [0|0] "" XXX - SG_ POS_RR_W_LAMP : 7|1@1+ (1,0) [0|0] "" XXX - SG_ PRESSURE_FL : 16|8@1+ (1,0) [0|0] "" XXX - SG_ PRESSURE_FR : 24|8@1+ (1,0) [0|0] "" XXX - SG_ PRESSURE_RL : 32|8@1+ (1,0) [0|0] "" XXX - SG_ PRESSURE_RR : 40|8@1+ (1,0) [0|0] "" XXX - SG_ STATUS_TPMS : 8|3@1+ (1,0) [0|0] "" XXX - SG_ TPMS_W_LAMP : 0|2@1+ (1,0) [0|0] "" XXX - SG_ TREAD_W_LAMP : 2|2@1+ (1,0) [0|0] "" XXX - SG_ UNIT : 11|2@1+ (1,0) [0|0] "" XXX - -BO_ 1456 CLU12: 4 XXX - SG_ CF_Clu_Odometer : 0|24@1+ (0.1,0) [0|0] "" XXX - - -CM_ SG_ 1348 SpeedLim_Nav_Clu "Speed limit displayed on Nav, Cluster and HUD"; - -VAL_ 871 CF_Lvr_Gear 12 "T" 5 "D" 8 "S" 6 "N" 7 "R" 0 "P"; -VAL_ 909 CF_VSM_Warn 2 "FCW" 3 "AEB"; -VAL_ 916 ACCEnable 0 "SCC ready" 1 "SCC temp fault" 2 "SCC permanent fault" 3 "SCC permanent fault, communication issue"; -VAL_ 1057 ACCMode 0 "off" 1 "enabled" 2 "driver_override" 3 "off_maybe_fault" 4 "cancelled"; -VAL_ 1157 HDA_Icon_State 0 "no_hda" 1 "white_hda" 2 "green_hda"; -VAL_ 1157 LFA_SysWarning 0 "no_message" 1 "switching_to_hda" 2 "switching_to_scc" 3 "lfa_error" 4 "check_hda" 5 "keep_hands_on_wheel_orange" 6 "keep_hands_on_wheel_red"; -VAL_ 1157 LFA_Icon_State 0 "no_wheel" 1 "white_wheel" 2 "green_wheel" 3 "green_wheel_blink"; -VAL_ 1157 HDA_SysWarning 0 "no_message" 1 "driving_convenience_systems_cancelled" 2 "highway_drive_assist_system_cancelled"; -VAL_ 1322 CF_Clu_Gear 1 "P" 2 "R" 4 "N" 8 "D"; diff --git a/opendbc/dbc/generator/rivian/.gitignore b/opendbc/dbc/generator/rivian/.gitignore deleted file mode 100644 index c6687b3e567..00000000000 --- a/opendbc/dbc/generator/rivian/.gitignore +++ /dev/null @@ -1 +0,0 @@ -rivian_mando_front_radar.dbc \ No newline at end of file diff --git a/opendbc/dbc/generator/rivian/rivian_mando_front_radar.py b/opendbc/dbc/generator/rivian/rivian_mando_front_radar.py deleted file mode 100755 index cdddfd8f281..00000000000 --- a/opendbc/dbc/generator/rivian/rivian_mando_front_radar.py +++ /dev/null @@ -1,59 +0,0 @@ -#!/usr/bin/env python3 -import os - -if __name__ == "__main__": - dbc_name = os.path.basename(__file__).replace(".py", ".dbc") - rivian_path = os.path.dirname(os.path.realpath(__file__)) - with open(os.path.join(rivian_path, dbc_name), "w", encoding='utf-8') as f: - f.write(""" -VERSION "" - - -NS_ : - NS_DESC_ - CM_ - BA_DEF_ - BA_ - VAL_ - CAT_DEF_ - CAT_ - FILTER - BA_DEF_DEF_ - EV_DATA_ - ENVVAR_DATA_ - SGTYPE_ - SGTYPE_VAL_ - BA_DEF_SGTYPE_ - BA_SGTYPE_ - SIG_TYPE_REF_ - VAL_TABLE_ - SIG_GROUP_ - SIG_VALTYPE_ - SIGTYPE_VALTYPE_ - BO_TX_BU_ - BA_DEF_REL_ - BA_REL_ - BA_DEF_DEF_REL_ - BU_SG_REL_ - BU_EV_REL_ - BU_BO_REL_ - SG_MUL_VAL_ - -BS_: - -BU_: XXX - """) - - # note: 0x501/0x502 seem to be special in 0x5XX range - for a in range(0x500, 0x500 + 32): - f.write(f""" -BO_ {a} RADAR_TRACK_{a:x}: 8 RADAR - SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX - SG_ COUNTER : 11|4@0+ (1,0) [0|15] "" XXX - SG_ UNKNOWN_1 : 23|8@0- (1,0) [-128|127] "" XXX - SG_ AZIMUTH : 28|10@0- (0.1,0) [-61.2|62.1] "" XXX - SG_ STATE : 31|3@0+ (1,0) [0|7] "" XXX - SG_ LONG_DIST : 34|11@0+ (0.1,0) [0|204.7] "" XXX - SG_ STATE_2 : 55|1@0+ (1,0) [0|1] "" XXX - SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "" XXX - """) diff --git a/opendbc/dbc/generator/hyundai/hyundai_canfd.dbc b/opendbc/dbc/hyundai_canfd.dbc similarity index 50% rename from opendbc/dbc/generator/hyundai/hyundai_canfd.dbc rename to opendbc/dbc/hyundai_canfd.dbc index 31f5a662e21..1ef67c044a9 100644 --- a/opendbc/dbc/generator/hyundai/hyundai_canfd.dbc +++ b/opendbc/dbc/hyundai_canfd.dbc @@ -1,10 +1,46 @@ -CM_ "IMPORT _hyundai_common.dbc"; +VERSION "" + + +NS_ : + NS_DESC_ + CM_ + BA_DEF_ + BA_ + VAL_ + CAT_DEF_ + CAT_ + FILTER + BA_DEF_DEF_ + EV_DATA_ + ENVVAR_DATA_ + SGTYPE_ + SGTYPE_VAL_ + BA_DEF_SGTYPE_ + BA_SGTYPE_ + SIG_TYPE_REF_ + VAL_TABLE_ + SIG_GROUP_ + SIG_VALTYPE_ + SIGTYPE_VALTYPE_ + BO_TX_BU_ + BA_DEF_REL_ + BA_REL_ + BA_DEF_DEF_REL_ + BU_SG_REL_ + BU_EV_REL_ + BU_BO_REL_ + SG_MUL_VAL_ + +BS_: + +BU_: XXX CAMERA FRONT_RADAR ADRV APRK + BO_ 53 ACCELERATOR: 32 XXX SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX - SG_ ACCELERATOR_PEDAL : 40|8@1+ (1,0) [0|255] "" XXX SG_ GEAR : 192|3@1+ (1,0) [0|7] "" XXX + SG_ ACCELERATOR_PEDAL : 40|8@1+ (1,0) [0|255] "" XXX BO_ 64 GEAR_ALT: 32 XXX SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX @@ -16,6 +52,27 @@ BO_ 69 GEAR: 24 XXX SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX SG_ GEAR : 44|3@1+ (1,0) [0|7] "" XXX +BO_ 80 LKAS: 16 XXX + SG_ STEER_REQ : 52|1@1+ (1,0) [0|1] "" XXX + SG_ TORQUE_REQUEST : 41|11@1+ (1,-1024) [0|4095] "" XXX + SG_ LKA_ICON : 38|2@1+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_1 : 27|2@1+ (1,0) [0|255] "" XXX + SG_ LFA_BUTTON : 56|1@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ STEER_MODE : 65|3@1+ (1,0) [0|1] "" XXX + SG_ LKA_WARNING : 32|1@1+ (1,0) [0|1] "" XXX + SG_ LKA_ASSIST : 62|1@1+ (1,0) [0|1] "" XXX + SG_ LKA_MODE : 24|3@1+ (1,0) [0|7] "" XXX + SG_ NEW_SIGNAL_2 : 70|2@0+ (1,0) [0|3] "" XXX + SG_ HAS_LANE_SAFETY : 80|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_3 : 111|8@0+ (1,0) [0|255] "" XXX + SG_ FCA_SYSWARN : 40|1@0+ (1,0) [0|1] "" XXX + +BO_ 81 ADRV_0x51: 32 ADRV + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + BO_ 96 ESP_STATUS: 32 XXX SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX @@ -41,17 +98,10 @@ BO_ 160 WHEEL_SPEEDS: 24 XXX SG_ MOVING_BACKWARD : 57|1@0+ (1,0) [0|1] "" XXX SG_ MOVING_FORWARD2 : 58|1@0+ (1,0) [0|1] "" XXX SG_ MOVING_BACKWARD2 : 59|1@0+ (1,0) [0|1] "" XXX - SG_ WHL_SpdFLVal : 64|14@1+ (0.03125,0) [0|0] "km^h" XXX - SG_ WHL_SpdFRVal : 80|14@1+ (0.03125,0) [0|0] "km^h" XXX - SG_ WHL_SpdRLVal : 96|14@1+ (0.03125,0) [0|0] "km^h" XXX - SG_ WHL_SpdRRVal : 112|14@1+ (0.03125,0) [0|0] "km^h" XXX - -BO_ 203 LFA_ALT: 24 ADRV - SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX - SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX - SG_ LKAS_ANGLE_ACTIVE : 29|2@0+ (1,0) [0|1] "" XXX - SG_ LKAS_ANGLE_CMD : 32|14@1- (0.1,0) [0|511] "" XXX - SG_ LKAS_ANGLE_MAX_TORQUE : 55|8@0+ (1,0) [0|255] "" XXX + SG_ WHEEL_SPEED_1 : 64|16@1+ (0.03125,0) [0|65535] "kph" XXX + SG_ WHEEL_SPEED_2 : 80|16@1+ (0.03125,0) [0|65535] "kph" XXX + SG_ WHEEL_SPEED_3 : 96|16@1+ (0.03125,0) [0|65535] "kph" XXX + SG_ WHEEL_SPEED_4 : 112|16@1+ (0.03125,0) [0|65535] "kph" XXX BO_ 234 MDPS: 24 XXX SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX @@ -60,10 +110,8 @@ BO_ 234 MDPS: 24 XXX SG_ LKA_FAULT : 54|1@0+ (1,0) [0|1] "" XXX SG_ STEERING_OUT_TORQUE : 64|12@1+ (0.1,-204.8) [0|65535] "" XXX SG_ STEERING_COL_TORQUE : 80|13@1+ (1,-4095) [0|4095] "" XXX - SG_ STEERING_ANGLE : 96|16@1- (0.1,0) [0|255] "deg" XXX - SG_ STEERING_ANGLE_2 : 128|16@1- (0.1,0) [0|65535] "deg" XXX - SG_ LKA_ANGLE_ACTIVE : 145|2@0+ (1,0) [0|3] "" XXX - SG_ LKA_ANGLE_FAULT : 149|1@0+ (1,0) [0|1] "" XXX + SG_ STEERING_ANGLE : 96|16@1- (-0.1,0) [0|255] "deg" XXX + SG_ STEERING_ANGLE_2 : 128|16@1- (-0.1,0) [0|65535] "deg" XXX BO_ 256 ACCELERATOR_BRAKE_ALT: 32 XXX SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX @@ -77,45 +125,41 @@ BO_ 261 ACCELERATOR_ALT: 32 XXX SG_ ACCELERATOR_PEDAL : 103|10@1+ (0.25,0) [0|1022] "" XXX BO_ 272 LKAS_ALT: 32 XXX - SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX - SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX - SG_ LKA_MODE : 24|3@1+ (1,0) [0|7] "" XXX - SG_ LKA_AVAILABLE : 27|2@1+ (1,0) [0|255] "" XXX - SG_ LKA_WARNING : 32|1@1+ (1,0) [0|1] "" XXX - SG_ LKA_ICON : 38|2@1+ (1,0) [0|255] "" XXX - SG_ FCA_SYSWARN : 40|1@0+ (1,0) [0|1] "" XXX - SG_ TORQUE_REQUEST : 41|11@1+ (1,-1024) [0|4095] "" XXX SG_ STEER_REQ : 52|1@1+ (1,0) [0|1] "" XXX + SG_ TORQUE_REQUEST : 41|11@1+ (1,-1024) [0|4095] "" XXX + SG_ LKA_ICON : 38|2@1+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_1 : 27|2@1+ (1,0) [0|255] "" XXX SG_ LFA_BUTTON : 56|1@1+ (1,0) [0|255] "" XXX - SG_ LKA_ASSIST : 62|1@1+ (1,0) [0|1] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX SG_ STEER_MODE : 65|3@1+ (1,0) [0|1] "" XXX + SG_ LKA_WARNING : 32|1@1+ (1,0) [0|1] "" XXX + SG_ LKA_ASSIST : 62|1@1+ (1,0) [0|1] "" XXX + SG_ LKA_MODE : 24|3@1+ (1,0) [0|7] "" XXX SG_ NEW_SIGNAL_2 : 70|2@0+ (1,0) [0|3] "" XXX - SG_ LKAS_ANGLE_ACTIVE : 77|2@0+ (1,0) [0|3] "" XXX SG_ HAS_LANE_SAFETY : 80|1@0+ (1,0) [0|1] "" XXX - SG_ LKAS_ANGLE_CMD : 82|14@1- (0.1,0) [0|511] "" XXX - SG_ LKAS_ANGLE_MAX_TORQUE : 96|8@1+ (1,0) [0|255] "" XXX SG_ NEW_SIGNAL_3 : 111|8@0+ (1,0) [0|255] "" XXX + SG_ FCA_SYSWARN : 40|1@0+ (1,0) [0|1] "" XXX BO_ 293 STEERING_SENSORS: 16 XXX SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX - SG_ STEERING_ANGLE : 24|16@1- (0.1,0) [0|255] "deg" XXX SG_ STEERING_RATE : 40|8@1+ (4,0) [0|1016] "deg/s" XXX + SG_ STEERING_ANGLE : 24|16@1- (-0.1,0) [0|255] "deg" XXX BO_ 298 LFA: 16 ADRV - SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX - SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX - SG_ LKA_MODE : 24|3@1+ (1,0) [0|7] "" XXX - SG_ NEW_SIGNAL_1 : 27|2@1+ (1,0) [0|255] "" XXX - SG_ LKA_WARNING : 32|1@1+ (1,0) [0|1] "" XXX - SG_ LKA_ICON : 38|2@1+ (1,0) [0|255] "" XXX - SG_ TORQUE_REQUEST : 41|11@1+ (1,-1024) [0|4095] "" XXX SG_ STEER_REQ : 52|1@1+ (1,0) [0|1] "" XXX + SG_ TORQUE_REQUEST : 41|11@1+ (1,-1024) [0|4095] "" XXX + SG_ LKA_ICON : 38|2@1+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_1 : 27|2@1+ (1,0) [0|255] "" XXX SG_ LFA_BUTTON : 56|1@1+ (1,0) [0|255] "" XXX - SG_ LKA_ASSIST : 62|1@1+ (1,0) [0|1] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX SG_ STEER_MODE : 65|3@1+ (1,0) [0|1] "" XXX + SG_ LKA_WARNING : 32|1@1+ (1,0) [0|1] "" XXX + SG_ LKA_ASSIST : 62|1@1+ (1,0) [0|1] "" XXX + SG_ LKA_MODE : 24|3@1+ (1,0) [0|7] "" XXX SG_ NEW_SIGNAL_2 : 70|2@0+ (1,0) [0|3] "" XXX - SG_ NEW_SIGNAL_4 : 72|4@1+ (1,0) [0|15] "" XXX SG_ HAS_LANE_SAFETY : 80|1@0+ (1,0) [0|1] "" XXX SG_ NEW_SIGNAL_3 : 111|8@0+ (1,0) [0|255] "" XXX @@ -123,133 +167,14 @@ BO_ 304 GEAR_SHIFTER: 16 XXX SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX SG_ PARK_BUTTON : 32|2@1+ (1,0) [0|3] "" XXX - SG_ KNOB_POSITION : 40|3@1+ (1,0) [0|3] "" XXX SG_ GEAR : 64|3@1+ (1,0) [0|7] "" XXX - -BO_ 352 ADRV_0x160: 16 ADRV - SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX - SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX - SG_ AEB_SETTING : 24|2@1+ (1,0) [0|255] "" XXX - SG_ SET_ME_2 : 56|8@1+ (1,0) [0|1] "" XXX - SG_ SET_ME_FF : 64|8@1+ (1,0) [0|255] "" XXX - SG_ SET_ME_FC : 72|8@1+ (1,0) [0|255] "" XXX - SG_ SET_ME_9 : 80|8@1+ (1,0) [0|255] "" XXX - -BO_ 353 CCNC_0x161: 32 CCNC - SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX - SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX - SG_ FCA_ICON : 24|3@1+ (1,0) [0|7] "" XXX - SG_ FCA_ALT_ICON : 27|3@1+ (1,0) [0|7] "" XXX - SG_ LKA_ICON : 30|3@1+ (1,0) [0|3] "" XXX - SG_ HBA_ICON : 33|3@1+ (1,0) [0|7] "" XXX - SG_ ZEROS_1 : 36|4@1+ (1,0) [0|15] "" XXX - SG_ ZEROS_2 : 40|2@1+ (1,0) [0|3] "" XXX - SG_ FCA_IMAGE : 42|3@1+ (1,0) [0|7] "" XXX - SG_ ZEROS_3 : 45|3@1+ (1,0) [0|7] "" XXX - SG_ ZEROS_4 : 48|3@1+ (1,0) [0|7] "" XXX - SG_ BCA_LEFT : 51|3@1+ (1,0) [0|7] "" XXX - SG_ BCA_RIGHT : 54|3@1+ (1,0) [0|7] "" XXX - SG_ LCA_LEFT_ARROW : 57|3@1+ (1,0) [0|7] "" XXX - SG_ LCA_RIGHT_ARROW : 60|3@1+ (1,0) [0|7] "" XXX - SG_ ZEROS_5 : 63|1@0+ (1,0) [0|1] "" XXX - SG_ CENTERLINE : 64|2@1+ (1,0) [0|3] "" XXX - SG_ TARGET : 66|3@1+ (1,0) [0|7] "" XXX - SG_ TARGET_DISTANCE : 69|11@1+ (0.1,0) [0|204.7] "m" XXX - SG_ LANELINE_LEFT : 80|4@1+ (1,0) [0|15] "" XXX - SG_ LANELINE_LEFT_POSITION : 84|6@1+ (1,0) [0|15] "" XXX - SG_ LANELINE_RIGHT : 90|4@1+ (1,0) [0|15] "" XXX - SG_ LANELINE_RIGHT_POSITION : 94|6@1+ (1,0) [0|3] "" XXX - SG_ LANELINE_CURVATURE : 100|5@1- (1,15) [0|31] "" XXX - SG_ LANE_HIGHLIGHT : 105|4@1+ (1,0) [0|15] "" XXX - SG_ LANE_HIGHLIGHT_DISTANCE : 109|11@1+ (0.1,0) [0|204.7] "m" XXX - SG_ LANE_LEFT : 120|3@1+ (1,0) [0|7] "" XXX - SG_ LANE_RIGHT : 123|3@1+ (1,0) [0|7] "" XXX - SG_ LANE_ZOOM : 126|2@1+ (1,0) [0|3] "" XXX - SG_ ALERTS_1 : 128|6@1+ (1,0) [0|63] "" XXX - SG_ ALERTS_2 : 134|5@1+ (1,0) [0|3] "" XXX - SG_ ALERTS_3 : 139|5@1+ (1,0) [0|15] "" XXX - SG_ ALERTS_4 : 144|8@1+ (1,0) [0|511] "" XXX - SG_ ALERTS_5 : 152|5@1+ (1,0) [0|7] "" XXX - SG_ MUTE : 157|3@1+ (1,0) [0|7] "" XXX - SG_ SOUNDS_1 : 160|4@1+ (1,0) [0|3] "" XXX - SG_ SOUNDS_2 : 164|4@1+ (1,0) [0|3] "" XXX - SG_ SOUNDS_3 : 168|4@1+ (1,0) [0|15] "" XXX - SG_ SOUNDS_4 : 172|3@1+ (1,0) [0|7] "" XXX - SG_ ZEROS_6 : 175|1@0+ (1,0) [0|1] "" XXX - SG_ ZEROS_7 : 176|5@1+ (1,0) [0|31] "" XXX - SG_ SETSPEED_HUD : 181|3@1+ (1,0) [0|3] "" XXX - SG_ DISTANCE_LEAD : 184|5@1+ (1,0) [0|31] "" XXX - SG_ DISTANCE_CAR : 189|3@1+ (1,0) [0|7] "" XXX - SG_ DISTANCE_SPACING : 192|4@1+ (1,0) [0|15] "" XXX - SG_ DISTANCE : 196|4@1+ (1,0) [0|7] "" XXX - SG_ SETSPEED_SPEED : 200|8@1+ (1,0) [0|255] "" XXX - SG_ SETSPEED : 208|4@1+ (1,0) [0|3] "" XXX - SG_ HDA_ICON : 212|4@1+ (1,0) [0|3] "" XXX - SG_ SLA_ICON : 216|4@1+ (1,0) [0|15] "" XXX - SG_ NAV_ICON : 220|4@1+ (1,0) [0|3] "" XXX - SG_ LFA_ICON : 224|4@1+ (1,0) [0|3] "" XXX - SG_ LCA_LEFT_ICON : 228|4@1+ (1,0) [0|15] "" XXX - SG_ LCA_RIGHT_ICON : 232|4@1+ (1,0) [0|15] "" XXX - SG_ BACKGROUND : 236|4@1+ (1,0) [0|15] "" XXX - SG_ DAW_ICON : 240|3@1+ (1,0) [0|7] "" XXX - SG_ CAR_CIRCLE : 243|3@1+ (1,0) [0|7] "" XXX - SG_ ZEROS_8 : 246|2@1+ (1,0) [0|3] "" XXX - SG_ ZEROS_9 : 248|8@1+ (1,0) [0|255] "" XXX - -BO_ 354 CCNC_0x162: 32 CCNC - SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX - SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX - SG_ COUNTRY : 24|4@1+ (1,0) [0|7] "" XXX - SG_ SPEEDLIMIT_FLASH : 28|4@1+ (1,0) [0|15] "" XXX - SG_ SPEEDLIMIT : 32|8@1+ (1,0) [0|255] "" XXX - SG_ SIGNS : 40|8@1+ (1,0) [0|15] "" XXX - SG_ SPEEDLIMIT_WEATHER : 48|4@1+ (1,0) [0|15] "" XXX - SG_ VIBRATE : 52|3@1+ (1,0) [0|7] "" XXX - SG_ ZEROS_1 : 55|1@0+ (1,0) [0|1] "" XXX - SG_ ZEROS_2 : 56|8@1+ (1,0) [0|255] "" XXX - SG_ LEAD : 64|5@1+ (1,0) [0|31] "" XXX - SG_ LEAD_DISTANCE : 69|11@1+ (0.1,0) [0|204.7] "m" XXX - SG_ LEAD_LATERAL : 80|7@1+ (1,0) [0|127] "" XXX - SG_ ZEROS_3 : 87|1@0+ (1,0) [0|1] "" XXX - SG_ LEAD_ALT : 88|5@1+ (1,0) [0|31] "" XXX - SG_ LEAD_ALT_DISTANCE : 93|11@1+ (0.1,0) [0|204.7] "m" XXX - SG_ LEAD_ALT_LATERAL : 104|7@1+ (1,0) [0|127] "" XXX - SG_ ZEROS_4 : 111|1@0+ (1,0) [0|1] "" XXX - SG_ LEAD_LEFT : 112|5@1+ (1,0) [0|31] "" XXX - SG_ LEAD_LEFT_DISTANCE : 117|11@1+ (0.1,0) [0|204.7] "m" XXX - SG_ LEAD_LEFT_LATERAL : 128|7@1+ (1,0) [0|127] "" XXX - SG_ ZEROS_5 : 135|1@0+ (1,0) [0|1] "" XXX - SG_ LEAD_RIGHT : 136|5@1+ (1,0) [0|31] "" XXX - SG_ LEAD_RIGHT_DISTANCE : 141|11@1+ (0.1,0) [0|204.7] "m" XXX - SG_ LEAD_RIGHT_LATERAL : 152|7@1+ (1,0) [0|127] "" XXX - SG_ ZEROS_6 : 159|1@0+ (1,0) [0|1] "" XXX - SG_ ZEROS_7 : 160|8@1+ (1,0) [0|255] "" XXX - SG_ ZEROS_8 : 168|8@1+ (1,0) [0|255] "" XXX - SG_ ZEROS_9 : 176|8@1+ (1,0) [0|255] "" XXX - SG_ ZEROS_10 : 184|8@1+ (1,0) [0|255] "" XXX - SG_ ZEROS_11 : 192|8@1+ (1,0) [0|255] "" XXX - SG_ ZEROS_12 : 200|8@1+ (1,0) [0|255] "" XXX - SG_ ZEROS_13 : 208|5@1+ (1,0) [0|31] "" XXX - SG_ FAULT_FSS : 213|3@1+ (1,0) [0|7] "" XXX - SG_ FAULT_FCA : 216|3@1+ (1,0) [0|7] "" XXX - SG_ FAULT_LSS : 219|3@1+ (1,0) [0|7] "" XXX - SG_ FAULT_SLA : 222|3@1+ (1,0) [0|7] "" XXX - SG_ FAULT_DAW : 225|3@1+ (1,0) [0|7] "" XXX - SG_ FAULT_HBA : 228|3@1+ (1,0) [0|7] "" XXX - SG_ FAULT_SCC : 231|3@1+ (1,0) [0|7] "" XXX - SG_ FAULT_LFA : 234|3@1+ (1,0) [0|7] "" XXX - SG_ FAULT_HDA : 237|3@1+ (1,0) [0|7] "" XXX - SG_ FAULT_LCA : 240|3@1+ (1,0) [0|7] "" XXX - SG_ FAULT_HDP : 243|3@1+ (1,0) [0|7] "" XXX - SG_ FAULT_DAS : 246|3@1+ (1,0) [0|7] "" XXX - SG_ FAULT_ESS : 249|3@1+ (1,0) [0|7] "" XXX - SG_ ZEROS_14 : 252|4@1+ (1,0) [0|15] "" XXX + SG_ KNOB_POSITION : 40|3@1+ (1,0) [0|3] "" XXX BO_ 357 SPAS1: 24 APRK SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX SG_ COUNTER : 16|8@1+ (1,0) [0|0] "" XXX - SG_ NEW_SIGNAL_2 : 90|3@1+ (1,0) [0|0] "" XXX SG_ NEW_SIGNAL_1 : 96|16@1- (0.1,0) [0|0] "" XXX + SG_ NEW_SIGNAL_2 : 90|3@1+ (1,0) [0|0] "" XXX BO_ 362 SPAS2: 32 APRK SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX @@ -259,59 +184,92 @@ BO_ 362 SPAS2: 32 APRK BO_ 373 TCS: 24 XXX SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_1 : 80|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_2 : 74|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_3 : 76|1@0+ (1,0) [0|1] "" XXX SG_ NEW_SIGNAL_4 : 24|7@1+ (1,0) [0|127] "" XXX SG_ aBasis : 32|11@1+ (0.01,-10.23) [0|7] "m/s^2" XXX - SG_ ACCEL_REF_ACC : 48|11@1- (1,0) [0|1023] "" XXX - SG_ EQUIP_MAYBE : 64|1@0+ (1,0) [0|1] "" XXX - SG_ ACCEnable : 67|2@0+ (1,0) [0|3] "" XXX - SG_ ACC_REQ : 68|1@0+ (1,0) [0|1] "" XXX SG_ NEW_SIGNAL_5 : 72|1@0+ (1,0) [0|1] "" XXX - SG_ NEW_SIGNAL_2 : 74|1@0+ (1,0) [0|1] "" XXX - SG_ NEW_SIGNAL_3 : 76|1@0+ (1,0) [0|1] "" XXX - SG_ NEW_SIGNAL_1 : 80|1@0+ (1,0) [0|1] "" XXX - SG_ DriverBraking : 81|1@0+ (1,0) [0|1] "" XXX - SG_ DriverBrakingLowSens : 84|1@1+ (1,0) [0|1] "" XXX - SG_ AEB_EQUIP_MAYBE : 96|1@0+ (1,0) [0|1] "" XXX SG_ NEW_SIGNAL_6 : 128|4@1+ (1,0) [0|15] "" XXX SG_ NEW_SIGNAL_7 : 135|2@0+ (1,0) [0|3] "" XXX SG_ PROBABLY_EQUIP : 136|2@1+ (1,0) [0|3] "" XXX + SG_ AEB_EQUIP_MAYBE : 96|1@0+ (1,0) [0|1] "" XXX + SG_ EQUIP_MAYBE : 64|1@0+ (1,0) [0|1] "" XXX + SG_ DriverBraking : 81|1@0+ (1,0) [0|1] "" XXX + SG_ DriverBrakingLowSens : 84|1@1+ (1,0) [0|1] "" XXX + SG_ ACC_REQ : 68|1@0+ (1,0) [0|1] "" XXX + SG_ ACCEL_REF_ACC : 48|11@1- (1,0) [0|1023] "" XXX + SG_ ACCEnable : 67|2@0+ (1,0) [0|3] "" XXX + +BO_ 352 ADRV_0x160: 16 ADRV + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + SG_ SET_ME_FF : 64|8@1+ (1,0) [0|255] "" XXX + SG_ SET_ME_FC : 72|8@1+ (1,0) [0|255] "" XXX + SG_ SET_ME_2 : 56|8@1+ (1,0) [0|1] "" XXX + SG_ AEB_SETTING : 24|2@1+ (1,0) [0|255] "" XXX + SG_ SET_ME_9 : 80|8@1+ (1,0) [0|255] "" XXX + +BO_ 384 CAM_0x180: 32 CAMERA + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 385 CAM_0x181: 32 CAMERA + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 386 CAM_0x182: 32 CAMERA + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 387 CAM_0x183: 32 CAMERA + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 388 CAM_0x184: 32 CAMERA + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 389 CAM_0x185: 8 CAMERA + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX BO_ 416 SCC_CONTROL: 32 ADRV SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ NEW_SIGNAL_1 : 64|2@1+ (1,0) [0|3] "" XXX + SG_ NEW_SIGNAL_8 : 170|4@1+ (1,0) [0|15] "" XXX + SG_ ZEROS : 215|48@0+ (1,0) [0|281474976710655] "" XXX + SG_ ZEROS_3 : 191|7@0+ (1,0) [0|127] "" XXX + SG_ ZEROS_4 : 183|4@0+ (1,0) [0|63] "" XXX + SG_ ZEROS_6 : 119|16@0+ (1,0) [0|65535] "" XXX + SG_ ZEROS_8 : 95|5@0+ (1,0) [0|31] "" XXX + SG_ NEW_SIGNAL_3 : 109|2@0+ (1,0) [0|1] "" XXX + SG_ SET_ME_TMP_64 : 55|8@0+ (1,0) [0|63] "" XXX + SG_ SET_ME_2 : 105|3@1+ (1,0) [0|7] "" XXX + SG_ NEW_SIGNAL_6 : 104|1@0+ (1,0) [0|1] "" XXX SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX - SG_ ACC_ObjDist : 24|11@1+ (0.1,0) [0|204.7] "m" XXX - SG_ ACC_ObjRelSpd : 35|9@1+ (0.1,-16.4) [-16.4|34.7] "m/s" XXX + SG_ ZEROS_9 : 71|5@1+ (1,0) [0|15] "" XXX + SG_ ZEROS_10 : 111|2@0+ (1,0) [0|3] "" XXX SG_ SET_ME_3 : 45|2@0+ (1,0) [0|3] "" XXX SG_ ObjValid : 46|1@0+ (1,0) [0|3] "" XXX - SG_ SET_ME_TMP_64 : 55|8@0+ (1,0) [0|63] "" XXX - SG_ ZEROS_7 : 63|8@0+ (1,0) [0|255] "" XXX - SG_ NEW_SIGNAL_1 : 64|2@1+ (1,0) [0|3] "" XXX - SG_ MainMode_ACC : 66|1@1+ (1,0) [0|1] "" XXX - SG_ ACCMode : 68|3@1+ (1,0) [0|7] "" XXX - SG_ ZEROS_9 : 71|5@1+ (1,0) [0|15] "" XXX - SG_ CRUISE_STANDSTILL : 76|1@1+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_2 : 168|2@1+ (1,0) [0|3] "" XXX + SG_ OBJ_STATUS : 176|3@1+ (1,0) [0|7] "" XXX + SG_ ACC_ObjDist : 24|11@1+ (0.1,0) [0|204.7] "m" XXX SG_ ZEROS_5 : 77|11@1+ (1,0) [0|2047] "" XXX SG_ DISTANCE_SETTING : 88|3@1+ (1,0) [0|3] "" XXX - SG_ ZEROS_8 : 95|5@0+ (1,0) [0|31] "" XXX - SG_ VSetDis : 103|8@0+ (1,0) [0|255] "km/h or mph" XXX - SG_ NEW_SIGNAL_6 : 104|1@0+ (1,0) [0|1] "" XXX - SG_ SET_ME_2 : 105|3@1+ (1,0) [0|7] "" XXX - SG_ NEW_SIGNAL_3 : 109|2@0+ (1,0) [0|1] "" XXX - SG_ ZEROS_10 : 111|2@0+ (1,0) [0|3] "" XXX - SG_ ZEROS_6 : 119|16@0+ (1,0) [0|65535] "" XXX - SG_ aReqValue : 128|11@1+ (0.01,-10.23) [-10.23|10.24] "m/s^2" XXX + SG_ ZEROS_2 : 207|5@0+ (1,0) [0|63] "" XXX + SG_ CRUISE_STANDSTILL : 76|1@1+ (1,0) [0|1] "" XXX SG_ aReqRaw : 140|11@1+ (0.01,-10.23) [-10.23|10.24] "m/s^2" XXX - SG_ JerkUpperLimit : 158|7@0+ (0.1,0) [0|0] "" XXX + SG_ aReqValue : 128|11@1+ (0.01,-10.23) [-10.23|10.24] "m/s^2" XXX + SG_ ZEROS_7 : 63|8@0+ (1,0) [0|255] "" XXX + SG_ ACCMode : 68|3@1+ (1,0) [0|7] "" XXX + SG_ ACC_ObjRelSpd : 35|9@1+ (0.1,-16.4) [-16.4|34.7] "m/s" XXX SG_ JerkLowerLimit : 166|7@0+ (0.1,0) [0|12.7] "m/s^3" XXX - SG_ NEW_SIGNAL_2 : 168|2@1+ (1,0) [0|3] "" XXX - SG_ NEW_SIGNAL_8 : 170|4@1+ (1,0) [0|15] "" XXX - SG_ OBJ_STATUS : 176|3@1+ (1,0) [0|7] "" XXX - SG_ ZEROS_4 : 183|4@0+ (1,0) [0|63] "" XXX SG_ StopReq : 184|1@0+ (1,0) [0|1] "" XXX - SG_ ZEROS_3 : 191|7@0+ (1,0) [0|127] "" XXX SG_ NEW_SIGNAL_15 : 192|11@1+ (0.1,0) [0|204.7] "m" XXX - SG_ ZEROS_2 : 207|5@0+ (1,0) [0|63] "" XXX - SG_ ZEROS : 215|48@0+ (1,0) [0|281474976710655] "" XXX + SG_ VSetDis : 103|8@0+ (1,0) [0|255] "km/h or mph" XXX + SG_ MainMode_ACC : 66|1@1+ (1,0) [0|1] "" XXX + SG_ JerkUpperLimit : 158|7@0+ (0.1,0) [0|0] "" XXX BO_ 426 CRUISE_BUTTONS_ALT: 16 XXX SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX @@ -322,8 +280,8 @@ BO_ 426 CRUISE_BUTTONS_ALT: 16 XXX SG_ NEW_SIGNAL_2 : 31|3@1+ (1,0) [0|7] "" XXX SG_ ADAPTIVE_CRUISE_MAIN_BTN : 34|1@1+ (1,0) [0|1] "" XXX SG_ NEW_SIGNAL_3 : 35|1@1+ (1,0) [0|1] "" XXX + SG_ LFA_BTN : 39|1@1+ (1,0) [0|1] "" XXX SG_ CRUISE_BUTTONS : 36|3@1+ (1,0) [0|4] "" XXX - SG_ LDA_BTN : 39|1@1+ (1,0) [0|1] "" XXX SG_ NEW_SIGNAL_4 : 40|1@1+ (1,0) [0|1] "" XXX SG_ NORMAL_CRUISE_MAIN_BTN : 41|1@1+ (1,0) [0|1] "" XXX SG_ NEW_SIGNAL_5 : 42|2@1+ (1,0) [0|3] "" XXX @@ -340,53 +298,32 @@ BO_ 426 CRUISE_BUTTONS_ALT: 16 XXX SG_ BYTE14 : 112|8@1+ (1,0) [0|255] "" XXX SG_ BYTE15 : 120|8@1+ (1,0) [0|255] "" XXX -BO_ 437 CCNC_0x1B5: 32 CCNC - SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX - SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX - SG_ LEFT : 24|2@1+ (1,0) [0|3] "" XXX - SG_ LEFT_LDW : 27|1@0+ (1,0) [0|1] "" XXX - SG_ LEFT_1 : 29|9@1+ (1,0) [0|511] "" XXX - SG_ LEFT_2 : 38|5@1+ (1,0) [0|31] "" XXX - SG_ LEFT_3 : 43|10@1- (1,0) [0|1023] "" XXX - SG_ LEFT_4 : 64|16@1- (1,0) [0|65535] "" XXX - SG_ LEFT_5 : 80|16@1- (1,0) [0|65535] "" XXX - SG_ RIGHT : 96|2@1+ (1,0) [0|3] "" XXX - SG_ RIGHT_LDW : 99|1@0+ (1,0) [0|1] "" XXX - SG_ RIGHT_1 : 101|9@1+ (1,0) [0|511] "" XXX - SG_ RIGHT_2 : 110|5@1+ (1,0) [0|31] "" XXX - SG_ RIGHT_3 : 115|10@1- (1,0) [0|1023] "" XXX - SG_ RIGHT_4 : 128|16@1- (1,0) [0|65535] "" XXX - SG_ RIGHT_5 : 144|16@1- (1,0) [0|65535] "" XXX - SG_ LEAD : 192|2@1+ (1,0) [0|3] "" XXX - SG_ LEAD_1 : 194|6@1+ (1,0) [0|63] "" XXX - SG_ LEAD_2 : 200|11@1- (1,0) [0|4095] "" XXX - SG_ LEAD_3 : 211|1@0+ (1,0) [0|1] "" XXX - SG_ LEAD_DISTANCE : 213|11@1+ (0.1,0) [0|204.7] "m" XXX +BO_ 438 CAM_0x1b6: 32 CAMERA + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX -BO_ 442 BLINDSPOTS_REAR_CORNERS: 24 XXX +BO_ 439 CAM_0x1b7: 32 CAMERA + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 440 CAM_0x1b8: 32 CAMERA + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 441 CAM_0x1b9: 32 CAMERA SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX - SG_ LEFT_BLOCKED : 24|1@0+ (1,0) [0|1] "" XXX - SG_ LEFT_MB : 30|1@0+ (1,0) [0|3] "" XXX - SG_ MORE_LEFT_PROB : 32|1@1+ (1,0) [0|3] "" XXX - SG_ FL_INDICATOR : 46|6@0+ (1,0) [0|1] "" XXX - SG_ FR_INDICATOR : 54|6@0+ (1,0) [0|63] "" XXX - SG_ RIGHT_BLOCKED : 64|1@0+ (1,0) [0|1] "" XXX - SG_ COLLISION_AVOIDANCE_ACTIVE : 68|1@0+ (1,0) [0|1] "" XXX - SG_ NEW_SIGNAL_2 : 96|1@0+ (1,0) [0|1] "" XXX - SG_ FL_INDICATOR_ALT : 138|1@0+ (1,0) [0|1] "" XXX - SG_ FR_INDICATOR_ALT : 141|1@0+ (1,0) [0|1] "" XXX BO_ 463 CRUISE_BUTTONS: 8 XXX SG_ _CHECKSUM : 0|8@1+ (1,0) [0|65535] "" XXX - SG_ COUNTER : 12|4@1+ (1,0) [0|255] "" XXX - SG_ CRUISE_BUTTONS : 16|3@1+ (1,0) [0|3] "" XXX + SG_ LKAS_BTN : 23|1@1+ (1,0) [0|1] "" XXX + SG_ SET_ME_1 : 29|1@1+ (1,0) [0|1] "" XXX SG_ ADAPTIVE_CRUISE_MAIN_BTN : 19|1@1+ (1,0) [0|1] "" XXX SG_ NORMAL_CRUISE_MAIN_BTN : 21|1@1+ (1,0) [0|1] "" XXX - SG_ LDA_BTN : 23|1@1+ (1,0) [0|1] "" XXX + SG_ COUNTER : 12|4@1+ (1,0) [0|255] "" XXX + SG_ CRUISE_BUTTONS : 16|3@1+ (1,0) [0|3] "" XXX SG_ RIGHT_PADDLE : 25|1@1+ (1,0) [0|1] "" XXX SG_ LEFT_PADDLE : 27|1@1+ (1,0) [0|1] "" XXX - SG_ SET_ME_1 : 29|1@1+ (1,0) [0|1] "" XXX BO_ 474 ADRV_0x1da: 32 ADRV SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX @@ -397,26 +334,12 @@ BO_ 474 ADRV_0x1da: 32 ADRV BO_ 480 LFAHDA_CLUSTER: 16 ADRV SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX - SG_ NEW_SIGNAL_4 : 24|1@0+ (1,0) [0|1] "" XXX - SG_ NEW_SIGNAL_5 : 25|1@0+ (1,0) [0|1] "" XXX - SG_ NEW_SIGNAL_2 : 30|1@0+ (1,0) [0|1] "" XXX SG_ HDA_ICON : 31|1@1+ (1,0) [0|1] "" XXX - SG_ NEW_SIGNAL_1 : 32|3@1+ (1,0) [0|7] "" XXX SG_ LFA_ICON : 47|2@1+ (1,0) [0|3] "" XXX + SG_ NEW_SIGNAL_1 : 32|3@1+ (1,0) [0|7] "" XXX + SG_ NEW_SIGNAL_2 : 30|1@0+ (1,0) [0|1] "" XXX SG_ NEW_SIGNAL_3 : 49|1@0+ (1,0) [0|1] "" XXX - -BO_ 485 BLINDSPOTS_FRONT_CORNER_1: 16 XXX - SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX - SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX - SG_ REVERSING : 24|1@0+ (1,0) [0|1] "" XXX - SG_ NEW_SIGNAL_5 : 31|2@0+ (1,0) [0|3] "" XXX - SG_ NEW_SIGNAL_7 : 32|2@1+ (1,0) [0|3] "" XXX - SG_ NEW_SIGNAL_8 : 47|8@0+ (1,0) [0|255] "" XXX - SG_ NEW_SIGNAL_9 : 55|8@0+ (1,0) [0|255] "" XXX - SG_ NEW_SIGNAL_4 : 80|1@0+ (1,0) [0|1] "" XXX - SG_ NEW_SIGNAL_3 : 88|1@0+ (1,0) [0|1] "" XXX - SG_ NEW_SIGNAL_2 : 96|1@0+ (1,0) [0|1] "" XXX - SG_ NEW_SIGNAL_1 : 108|2@0+ (1,0) [0|3] "" XXX + SG_ NEW_SIGNAL_4 : 24|1@0+ (1,0) [0|1] "" XXX BO_ 490 ADRV_0x1ea: 32 ADRV SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX @@ -431,34 +354,21 @@ BO_ 490 ADRV_0x1ea: 32 ADRV SG_ NEW_SIGNAL_7 : 80|5@1+ (1,0) [0|31] "" XXX SG_ NEW_SIGNAL_8 : 88|7@1+ (1,0) [0|127] "" XXX SG_ NEW_SIGNAL_9 : 96|1@0+ (1,0) [0|1] "" XXX - SG_ SET_ME_FF : 120|8@1+ (1,0) [0|255] "" XXX SG_ NEW_SIGNAL_10 : 143|5@0+ (1,0) [0|31] "" XXX SG_ NEW_SIGNAL_11 : 144|3@1+ (1,0) [0|7] "" XXX SG_ NEW_SIGNAL_12 : 152|6@1+ (1,0) [0|63] "" XXX SG_ NEW_SIGNAL_13 : 160|1@0+ (1,0) [0|1] "" XXX SG_ NEW_SIGNAL_14 : 163|5@1+ (1,0) [0|31] "" XXX - SG_ NEW_SIGNAL_16 : 168|3@1+ (1,0) [0|7] "" XXX SG_ NEW_SIGNAL_15 : 175|4@0+ (1,0) [0|63] "" XXX + SG_ NEW_SIGNAL_16 : 168|3@1+ (1,0) [0|7] "" XXX SG_ NEW_SIGNAL_17 : 176|2@1+ (1,0) [0|3] "" XXX SG_ NEW_SIGNAL_18 : 184|1@0+ (1,0) [0|1] "" XXX SG_ NEW_SIGNAL_19 : 208|3@1+ (1,0) [0|7] "" XXX SG_ NEW_SIGNAL_20 : 212|1@0+ (1,0) [0|1] "" XXX + SG_ SET_ME_FF : 120|8@1+ (1,0) [0|255] "" XXX SG_ SET_ME_TMP_F : 232|5@1+ (1,0) [0|31] "" XXX SG_ SET_ME_TMP_F_2 : 240|5@1+ (1,0) [0|31] "" XXX -BO_ 506 CLUSTER_SPEED_LIMIT: 32 XXX - SG_ SPEED_LIMIT_1 : 39|7@0+ (1,0) [0|255] "" XXX - SG_ SPEED_LIMIT_2 : 47|7@0+ (1,0) [0|255] "" XXX - SG_ SECONDARY_LIMIT_1 : 79|8@0+ (1,0) [0|127] "" XXX - SG_ SECONDARY_LIMIT_2 : 103|8@0+ (1,0) [0|127] "" XXX - SG_ SPEED_LIMIT_3 : 119|8@0+ (1,0) [0|255] "" XXX - SG_ ARROW_DOWN : 120|1@0+ (1,0) [0|1] "" XXX - SG_ ARROW_UP : 121|1@0+ (1,0) [0|1] "" XXX - SG_ CHIME_2 : 122|2@1+ (1,0) [0|7] "" XXX - SG_ SPEED_CHANGE_BLINKING : 129|1@1+ (1,0) [0|3] "" XXX - SG_ CHIME_1 : 133|1@0+ (1,0) [0|1] "" XXX - SG_ SCHOOL_ZONE : 155|1@0+ (1,0) [0|1] "" XXX - BO_ 507 CAM_0x1fb: 32 CAMERA SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX @@ -469,10 +379,134 @@ BO_ 512 ADRV_0x200: 8 ADRV SG_ SET_ME_E1 : 24|8@1+ (1,0) [0|255] "" XXX SG_ SET_ME_3A : 32|8@1+ (1,0) [0|255] "" XXX +BO_ 513 RADAR_0x201: 32 FRONT_RADAR + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 528 RADAR_0x210: 32 FRONT_RADAR + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 529 RADAR_0x211: 32 FRONT_RADAR + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 530 RADAR_0x212: 32 FRONT_RADAR + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 531 RADAR_0x213: 32 FRONT_RADAR + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 532 RADAR_0x214: 32 FRONT_RADAR + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 533 RADAR_0x215: 32 FRONT_RADAR + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 534 RADAR_0x216: 32 FRONT_RADAR + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 535 RADAR_0x217: 32 FRONT_RADAR + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 536 RADAR_0x218: 32 FRONT_RADAR + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 537 RADAR_0x219: 32 FRONT_RADAR + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 538 RADAR_0x21a: 32 FRONT_RADAR + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 539 RADAR_0x21b: 32 FRONT_RADAR + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 540 RADAR_0x21c: 32 FRONT_RADAR + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 541 RADAR_0x21d: 32 FRONT_RADAR + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 542 RADAR_0x21e: 32 FRONT_RADAR + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 543 RADAR_0x21f: 32 FRONT_RADAR + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 576 RADAR_0x240: 16 FRONT_RADAR + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + BO_ 593 RADAR_0x251: 16 FRONT_RADAR SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX +BO_ 674 CAM_0x2a2: 32 CAMERA + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 675 CAM_0x2a3: 32 CAMERA + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 676 CAM_0x2a4: 24 XXX + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + SG_ BYTE3 : 24|8@1+ (1,0) [0|255] "" XXX + SG_ BYTE4 : 32|8@1+ (1,0) [0|255] "" XXX + SG_ BYTE5 : 40|8@1+ (1,0) [0|255] "" XXX + SG_ BYTE6 : 48|8@1+ (1,0) [0|255] "" XXX + SG_ LEFT_LANE_LINE : 56|2@1+ (1,0) [0|3] "" XXX + SG_ SET_ME_0 : 58|2@1+ (1,0) [0|3] "" XXX + SG_ RIGHT_LANE_LINE : 60|2@1+ (1,0) [0|3] "" XXX + SG_ SET_ME_0_2 : 62|2@1+ (1,0) [0|3] "" XXX + SG_ BYTE8 : 64|8@1+ (1,0) [0|255] "" XXX + SG_ BYTE9 : 72|8@1+ (1,0) [0|255] "" XXX + SG_ BYTE10 : 80|8@1+ (1,0) [0|255] "" XXX + SG_ BYTE11 : 88|8@1+ (1,0) [0|255] "" XXX + SG_ BYTE12 : 96|8@1+ (1,0) [0|255] "" XXX + SG_ BYTE13 : 104|8@1+ (1,0) [0|255] "" XXX + SG_ BYTE14 : 112|8@1+ (1,0) [0|255] "" XXX + SG_ BYTE15 : 120|8@1+ (1,0) [0|255] "" XXX + SG_ BYTE16 : 128|8@1+ (1,0) [0|255] "" XXX + SG_ BYTE17 : 136|8@1+ (1,0) [0|255] "" XXX + SG_ BYTE18 : 144|8@1+ (1,0) [0|255] "" XXX + SG_ BYTE19 : 152|8@1+ (1,0) [0|255] "" XXX + SG_ BYTE20 : 160|8@1+ (1,0) [0|255] "" XXX + SG_ BYTE21 : 168|8@1+ (1,0) [0|255] "" XXX + SG_ BYTE22 : 176|8@1+ (1,0) [0|255] "" XXX + SG_ BYTE23 : 184|8@1+ (1,0) [0|255] "" XXX + +BO_ 699 CAM_0x2bb: 32 CAMERA + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 700 CAM_0x2bc: 32 CAMERA + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 701 CAM_0x2bd: 32 CAMERA + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 702 CAM_0x2be: 32 CAMERA + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + BO_ 736 MANUAL_SPEED_LIMIT_ASSIST: 32 XXX SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX @@ -522,28 +556,24 @@ BO_ 866 CAM_0x362: 32 CAMERA SG_ BYTE30 : 240|8@1+ (1,0) [0|255] "" XXX SG_ BYTE31 : 248|8@1+ (1,0) [0|255] "" XXX -BO_ 874 BLINDSPOTS_FRONT_CORNER_2: 16 XXX - SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX - SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX - BO_ 961 BLINKER_STALKS: 8 XXX - SG_ CHECKSUM_MAYBE : 7|8@0+ (1,0) [0|255] "" XXX SG_ COUNTER_ALT : 15|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM_MAYBE : 7|8@0+ (1,0) [0|255] "" XXX SG_ HIGHBEAM_FORWARD : 18|1@0+ (1,0) [0|1] "" XXX - SG_ LIGHT_KNOB_POSITION : 21|2@0+ (1,0) [0|3] "" XXX SG_ HIGHBEAM_BACKWARD : 26|1@0+ (1,0) [0|1] "" XXX - SG_ LEFT_BLINKER : 30|1@0+ (1,0) [0|1] "" XXX SG_ RIGHT_BLINKER : 32|1@0+ (1,0) [0|1] "" XXX + SG_ LEFT_BLINKER : 30|1@0+ (1,0) [0|1] "" XXX + SG_ LIGHT_KNOB_POSITION : 21|2@0+ (1,0) [0|3] "" XXX BO_ 1041 DOORS_SEATBELTS: 8 XXX SG_ CHECKSUM_MAYBE : 7|8@0+ (1,0) [0|65535] "" XXX SG_ COUNTER_ALT : 15|4@0+ (1,0) [0|15] "" XXX SG_ DRIVER_DOOR : 24|1@1+ (1,0) [0|1] "" XXX SG_ PASSENGER_DOOR : 34|1@0+ (1,0) [0|1] "" XXX - SG_ PASSENGER_SEATBELT : 36|1@0+ (1,0) [0|1] "" XXX - SG_ DRIVER_SEATBELT : 42|1@0+ (1,0) [0|1] "" XXX SG_ DRIVER_REAR_DOOR : 52|1@0+ (1,0) [0|1] "" XXX SG_ PASSENGER_REAR_DOOR : 56|1@0+ (1,0) [0|1] "" XXX + SG_ DRIVER_SEATBELT : 42|1@0+ (1,0) [0|1] "" XXX + SG_ PASSENGER_SEATBELT : 36|1@0+ (1,0) [0|1] "" XXX BO_ 1043 BLINKERS: 8 XXX SG_ LEFT_STALK : 8|1@0+ (1,0) [0|1] "" XXX @@ -555,6 +585,51 @@ BO_ 1043 BLINKERS: 8 XXX SG_ RIGHT_LAMP_ALT : 61|1@0+ (1,0) [0|1] "" XXX SG_ USE_ALT_LAMP : 62|1@0+ (1,0) [0|1] "" XXX +BO_ 1240 CLUSTER_INFO: 8 XXX + SG_ DISTANCE_UNIT : 0|1@1+ (1,0) [0|1] "" XXX + +BO_ 442 BLINDSPOTS_REAR_CORNERS: 24 XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ NEW_SIGNAL_2 : 96|1@0+ (1,0) [0|1] "" XXX + SG_ COLLISION_AVOIDANCE_ACTIVE : 68|1@0+ (1,0) [0|1] "" XXX + SG_ LEFT_MB : 30|1@0+ (1,0) [0|3] "" XXX + SG_ LEFT_BLOCKED : 24|1@0+ (1,0) [0|1] "" XXX + SG_ MORE_LEFT_PROB : 32|1@1+ (1,0) [0|3] "" XXX + SG_ FL_INDICATOR : 46|6@0+ (1,0) [0|1] "" XXX + SG_ FR_INDICATOR : 54|6@0+ (1,0) [0|63] "" XXX + SG_ RIGHT_BLOCKED : 64|1@0+ (1,0) [0|1] "" XXX + +BO_ 874 BLINDSPOTS_FRONT_CORNER_2: 16 XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + +BO_ 485 BLINDSPOTS_FRONT_CORNER_1: 16 XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ NEW_SIGNAL_1 : 108|2@0+ (1,0) [0|3] "" XXX + SG_ NEW_SIGNAL_2 : 96|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_3 : 88|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_4 : 80|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_5 : 31|2@0+ (1,0) [0|3] "" XXX + SG_ REVERSING : 24|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_7 : 32|2@1+ (1,0) [0|3] "" XXX + SG_ NEW_SIGNAL_8 : 47|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_9 : 55|8@0+ (1,0) [0|255] "" XXX + +BO_ 506 CLUSTER_SPEED_LIMIT: 32 XXX + SG_ SPEED_LIMIT_3 : 119|8@0+ (1,0) [0|255] "" XXX + SG_ SPEED_LIMIT_2 : 47|7@0+ (1,0) [0|255] "" XXX + SG_ SPEED_LIMIT_1 : 39|7@0+ (1,0) [0|255] "" XXX + SG_ SPEED_CHANGE_BLINKING : 129|1@1+ (1,0) [0|3] "" XXX + SG_ CHIME_2 : 122|2@1+ (1,0) [0|7] "" XXX + SG_ CHIME_1 : 133|1@0+ (1,0) [0|1] "" XXX + SG_ ARROW_DOWN : 120|1@0+ (1,0) [0|1] "" XXX + SG_ ARROW_UP : 121|1@0+ (1,0) [0|1] "" XXX + SG_ SECONDARY_LIMIT_1 : 79|8@0+ (1,0) [0|127] "" XXX + SG_ SECONDARY_LIMIT_2 : 103|8@0+ (1,0) [0|127] "" XXX + SG_ SCHOOL_ZONE : 155|1@0+ (1,0) [0|1] "" XXX + BO_ 1144 DRIVE_MODE: 8 XXX SG_ DRIVE_MODE : 0|16@1+ (1,-61611) [0|61611] "" XXX SG_ DRIVE_MODE2 : 28|3@1+ (1,0) [1|3] "" XXX @@ -572,9 +647,6 @@ BO_ 1151 HVAC_TOUCH_BUTTONS: 8 XXX SG_ RECIRC_BUTTON : 48|1@0+ (1,0) [0|1] "" XXX SG_ HEAT_BUTTON : 52|1@0+ (1,0) [0|1] "" XXX -BO_ 1240 CLUSTER_INFO: 8 XXX - SG_ DISTANCE_UNIT : 0|1@1+ (1,0) [0|1] "" XXX - BO_ 1259 LOCAL_TIME2: 8 XXX SG_ HOURS : 15|5@0+ (1,0) [0|31] "" XXX SG_ MINUTES : 21|6@0+ (1,0) [0|63] "" XXX @@ -586,121 +658,62 @@ BO_ 1264 LOCAL_TIME: 8 XXX SG_ MINUTES : 21|6@0+ (1,0) [0|63] "" XXX SG_ SECONDS : 31|8@0+ (1,0) [0|59] "" XXX +CM_ 272 "Alternative LKAS message, used on cars such as 2023 Ioniq 6, 2nd gen Kona. Matches LKAS except size is 32 bytes"; +CM_ 676 "Contains signals with detailed lane line information. Used by ADAS ECU on HDA 2 vehicles to operate LFA."; +CM_ 866 "Contains signals with detailed lane line information. Used by ADAS ECU on HDA 2 vehicles to operate LFA. Used on cars that use message 272."; +CM_ 1043 "Lamp signals do not seem universal on cars that use LKAS_ALT, but stalk signals do."; + +CM_ SG_ 80 HAS_LANE_SAFETY "If 0, hides LKAS 'Lane Safety' menu from vehicle settings"; CM_ SG_ 96 BRAKE_PRESSURE "User applied brake pedal pressure. Ramps from computer applied pressure on falling edge of cruise. Cruise cancels if !=0"; CM_ SG_ 101 BRAKE_POSITION "User applied brake pedal position, max is ~700. Signed on some vehicles"; -CM_ BO_ 272 "Alternative LKAS message, used on cars such as 2023 Ioniq 6, 2nd gen Kona. Matches LKAS except size is 32 bytes"; -CM_ SG_ 272 LKA_AVAILABLE "Angle control cars: 3 when LKA is generally available, goes to 0 during changes with LFA"; -CM_ SG_ 272 LKAS_ANGLE_CMD "tracks MDPS->STEERING_ANGLE when not engaged, not STEERING_SENSORS->STEERING_ANGLE"; -CM_ SG_ 298 NEW_SIGNAL_4 "todo: figure out why always set to 9"; -CM_ SG_ 352 SET_ME_9 "has something to do with AEB settings"; +CM_ SG_ 373 PROBABLY_EQUIP "aeb equip?"; CM_ SG_ 373 ACCEnable "Likely a copy of CAN's TCS13->ACCEnable"; CM_ SG_ 373 DriverBraking "Likely derived from BRAKE->BRAKE_POSITION"; CM_ SG_ 373 DriverBrakingLowSens "Higher threshold version of DriverBraking"; -CM_ SG_ 373 PROBABLY_EQUIP "aeb equip?"; +CM_ SG_ 352 SET_ME_9 "has something to do with AEB settings"; CM_ SG_ 416 VSetDis "set speed in display units"; -CM_ SG_ 480 NEW_SIGNAL_5 "todo: figure out why always set to 1"; +CM_ SG_ 676 LEFT_LANE_LINE "Left lane line confidence"; +CM_ SG_ 676 RIGHT_LANE_LINE "Right lane line confidence"; CM_ SG_ 736 MAX_SPEED "Display units. Restricts car from driving above this speed unless accelerator pedal is depressed beyond pressure point"; -CM_ BO_ 866 "Contains signals with detailed lane line information. Used by ADAS ECU on HDA 2 vehicles to operate LFA. Used on cars that use message 272."; CM_ SG_ 866 LEFT_LANE_LINE "Left lane line confidence"; CM_ SG_ 866 RIGHT_LANE_LINE "Right lane line confidence"; CM_ SG_ 961 COUNTER_ALT "only increments on change"; CM_ SG_ 1041 COUNTER_ALT "only increments on change"; -CM_ BO_ 1043 "Lamp signals do not seem universal on cars that use LKAS_ALT, but stalk signals do."; CM_ SG_ 1043 COUNTER_ALT "only increments on change"; CM_ SG_ 1043 USE_ALT_LAMP "likely 1 on cars that use alt lamp signals"; -VAL_ 53 GEAR 0 "P" 5 "D" 6 "N" 7 "R"; -VAL_ 64 GEAR 0 "P" 5 "D" 6 "N" 7 "R"; -VAL_ 69 GEAR 0 "P" 5 "D" 6 "N" 7 "R"; +VAL_ 53 GEAR 0 "P" 5 "D" 6 "N" 7 "R" ; +VAL_ 64 GEAR 0 "P" 5 "D" 6 "N" 7 "R" ; +VAL_ 69 GEAR 0 "P" 5 "D" 6 "N" 7 "R" ; +VAL_ 112 GEAR 0 "P" 5 "D" 6 "N" 7 "R" ; +VAL_ 80 LKA_ICON 0 "hidden" 1 "grey" 2 "green" 3 "flashing green" ; +VAL_ 80 LKA_MODE 1 "warning only" 2 "assist" 6 "off" ; VAL_ 96 TRACTION_AND_STABILITY_CONTROL 0 "On" 5 "Limited" 1 "Off"; -VAL_ 112 GEAR 0 "P" 5 "D" 6 "N" 7 "R"; -VAL_ 234 LKA_FAULT 0 "ok" 1 "lka fault"; -VAL_ 272 LKA_MODE 1 "warning only" 2 "assist" 6 "off"; -VAL_ 272 LKA_ICON 0 "hidden" 1 "grey" 2 "green" 3 "flashing green"; -VAL_ 272 LKAS_ANGLE_ACTIVE 0 "off" 1 "not active" 2 "active"; -VAL_ 298 LKA_MODE 1 "warning only" 2 "assist" 6 "off"; -VAL_ 298 LKA_ICON 0 "hidden" 1 "grey" 2 "green" 3 "flashing green"; +VAL_ 234 LKA_FAULT 0 "ok" 1 "lka fault" ; +VAL_ 272 LKA_ICON 0 "hidden" 1 "grey" 2 "green" 3 "flashing green" ; +VAL_ 272 LKA_MODE 1 "warning only" 2 "assist" 6 "off" ; +VAL_ 298 LKA_ICON 0 "hidden" 1 "grey" 2 "green" 3 "flashing green" ; +VAL_ 298 LKA_MODE 1 "warning only" 2 "assist" 6 "off" ; VAL_ 304 PARK_BUTTON 1 "Pressed" 2 "Not Pressed"; VAL_ 304 KNOB_POSITION 1 "R" 2 "N (on R side)" 3 "Centered" 4 "N (on D side)" 5 "D"; -VAL_ 304 GEAR 1 "P" 2 "R" 3 "N" 4 "D"; -VAL_ 352 AEB_SETTING 1 "off" 2 "warning only" 3 "active assist"; -VAL_ 353 FCA_ICON 0 "HIDDEN" 1 "ORANGE" 2 "RED"; -VAL_ 353 FCA_ALT_ICON 0 "HIDDEN" 1 "ORANGE" 3 "RED"; -VAL_ 353 LKA_ICON 0 "HIDDEN" 1 "ORANGE" 3 "GRAY" 4 "GREEN"; -VAL_ 353 HBA_ICON 0 "HIDDEN" 1 "GRAY" 2 "GREEN"; -VAL_ 353 FCA_IMAGE 0 "HIDDEN" 2 "VISIBLE"; -VAL_ 353 BCA_LEFT 0 "HIDDEN" 1 "VISIBLE" 2 "VISIBLE+ICON"; -VAL_ 353 BCA_RIGHT 0 "HIDDEN" 1 "VISIBLE" 2 "VISIBLE+ICON"; -VAL_ 353 LCA_LEFT_ARROW 0 "HIDDEN" 1 "VISIBLE"; -VAL_ 353 LCA_RIGHT_ARROW 0 "HIDDEN" 1 "VISIBLE"; -VAL_ 353 CENTERLINE 0 "HIDDEN" 1 "GREEN"; -VAL_ 353 TARGET 0 "HIDDEN" 1 "BLUE" 3 "WHITE"; -VAL_ 353 LANELINE_LEFT 0 "GRAY" 1 "HIDDEN" 2 "WHITE" 4 "ORANGE" 6 "GREEN"; -VAL_ 353 LANELINE_RIGHT 0 "GRAY" 1 "HIDDEN" 2 "WHITE" 4 "ORANGE" 6 "GREEN"; -VAL_ 353 LANE_HIGHLIGHT 0 "HIDDEN" 1 "GREEN" 2 "WHITE" 3 "BLUE" 4 "ORANGE" 5 "RED"; -VAL_ 353 LANE_LEFT 0 "HIDDEN" 1 "GREEN"; -VAL_ 353 LANE_RIGHT 0 "HIDDEN" 1 "GREEN"; -VAL_ 353 LANE_ZOOM 0 "ZOOM" 1 "HIDDEN"; -VAL_ 353 ALERTS_1 0 "HIDDEN" 1 "WARNING_ONLY_CAR_CENTER" 2 "WARNING_ONLY_CAR_LEFT" 3 "WARNING_ONLY_CAR_RIGHT" 4 "WARNING_ONLY_LEFT" 5 "WARNING_ONLY_RIGHT" 11 "EMERGENCY_BRAKING_CAR_CENTER" 12 "EMERGENCY_BRAKING_CAR_LEFT" 13 "EMERGENCY_BRAKING_CAR_RIGHT" 14 "EMERGENCY_BRAKING_LEFT" 15 "EMERGENCY_BRAKING_RIGHT" 21 "EMERGENCY_STEERING_CAR_LEFT" 22 "EMERGENCY_STEERING_CAR_RIGHT" 23 "EMERGENCY_STEERING_CAR_LEFT_AWAY" 24 "EMERGENCY_STEERING_CAR_RIGHT_AWAY" 25 "EMERGENCY_STEERING_REAR_LEFT" 26 "EMERGENCY_STEERING_REAR_RIGHT" 33 "DRIVE_CAREFULLY"; -VAL_ 353 ALERTS_2 0 "HIDDEN" 1 "KEEP_HANDS_ON_STEERING_WHEEL" 2 "KEEP_HANDS_ON_STEERING_WHEEL_RED" 3 "LANE_FOLLOWING_ASSIST_DEACTIVATED" 4 "HIGHWAY_DRIVING_ASSIST_DEACTIVATED" 5 "CONSIDER_TAKING_A_BREAK" 6 "PRESS_OK_BUTTON_TO_ENABLE_LANE_CHANGE_ASSIST" 7 "COLLISION_RISK_VEHICLE_TAKING_EMERGENCY_CONTROL" 8 "TAKE_CONTROL_OF_THE_VEHICLE_IMMEDIATELY_VEHICLE_IS_STOPPING" 9 "TAKE_CONTROL_OF_THE_VEHICLE_IMMEDIATELY" 11 "HIGHWAY_DRIVING_PILOT_SYSTEM_DEACTIVATED_AUDIBLE" 12 "KEEP_YOUR_EYES_ON_THE_ROAD" 13 "HIGHWAY_DRIVING_PILOT_CONDITIONS_NOT_MET_AUDIBLE" 14 "COLLISION_RISK_VEHICLE_TAKING_EMERGENCY_CONTROL" 15 "SET_THE_WIPER_AND_LIGHT_CONTROLS_TO_AUTO" 16 "BE_PREPARED_TO_TAKE_CONTROL_OF_THE_VEHICLE_AT_ANY_TIME" 21 "TAKE_CONTROL_OF_THE_VEHICLE_IMMEDIATELY_VEHICLE_IS_STOPPING" 10 "TAKE_CONTROL_OF_THE_VEHICLE_IMMEDIATELY"; -VAL_ 353 ALERTS_3 1 "AUTOMATICALLY_ADJUSTING_TO_THE_POSTED_SPEED_LIMIT" 2 "SET_SPEED_CHANGED" 3 "AUTOMATICALLY_ADJUSTING_TO_THE_POSTED_SPEED_LIMIT" 4 "SET_SPEED_CHANGED" 7 "DISTANCE_1" 8 "DISTANCE_2" 9 "DISTANCE_3" 10 "DISTANCE_4" 17 "DRIVE_CAREFULLY" 18 "CHECK_SURROUNDINGS" 19 "CONDITIONS_NOT_MET" 20 "LANES_NOT_DETECTED" 21 "CURVE_TOO_SHARP" 22 "LANE_TOO_NARROW" 23 "ROAD_TYPE_NOT_SUPPORTED" 24 "UNAVAILABLE_WITH_HAZARD_LIGHTS_ON" 25 "VEHICLE_SPEED_IS_TOO_LOW" 26 "KEEP_HANDS_ON_STEERING_WHEEL" 27 "LANE_TYPE_NOT_SUPPORTED" 28 "LANE_ASSIST_CANCELED_STEERING_INPUT_DETECTED" 0 "HIDDEN"; -VAL_ 353 ALERTS_4 0 "HIDDEN" 1 "TAKE_FOOT_OFF_THE_ACCELERATOR_PEDAL" 2 "TAKE_FOOT_OFF_THE_BRAKE_PEDAL" 3 "UNAVAILABLE_WHILE_HIGHWAY_DRIVING_PILOT_SYSTEM_IS_ACTIVE" 4 "TO_EXIT_HDP_GRASP_THE_STEERING_WHEEL_THEN_PRESS_AND_HOLD_THE_HDP_BUTTON" 5 "ACCELERATOR_PEDAL_OPERATION_LIMITED_FOR_SAFETY" 6 "TURN_OFF_HAZARD_WARNING_LIGHTS_AND_TURN_SIGNAL" 7 "KEEP_THE_DRIVERS_SEAT_IN_A_SAFE_DRIVING_POSITION" 16 "SET_SPEED_CHANGED" 17 "ACTIVATING_WINDSHIELD_DEFOG_TO_MAINTAIN_THE_DRIVERS_VIEW" 18 "SET_THE_WIPER_AND_LIGHT_CONTROLS_TO_AUTO" 19 "VEHICLE_SPEED_REDUCED_FOR_SAFETY_MERGING_LANES_AHEAD" 20 "SPEED_REDUCED_FOR_SAFETY_CONSTRUCTION_ZONE_DETECTED" 21 "VEHICLE_SPEED_LIMITED_SENSOR_DETECTION_RANGE_LIMITED" 22 "PREPARE_TO_TAKE_CONTROL_UNSUPPORTED_ROAD_TYPE_AHEAD" 23 "PREPARE_TO_TAKE_CONTROL_ENTRANCE_AND_EXIT_RAMPS_AHEAD" 24 "PREPARE_TO_TAKE_CONTROL_TOLLGATE_AHEAD" 25 "PREPARE_TO_TAKE_CONTROL_ROAD_EVENT_AHEAD" 26 "CLEARING_PATH_FOR_EMERGENCY_VEHICLE" 27 "VEHICLE_IS_TOO_SLOW_COMPARED_TO_TRAFFIC_FLOW" 28 "AFTER_SUNSET_HDP_IS_AVAILABLE_IN_AN_INSIDE_LANE_BEHIND_A_LEADING_VEHICLE" 29 "VEHICLE_SPEED_LIMITED_MERGING_LANES_AHEAD" 30 "VEHICLE_SPEED_LIMITED_CONSTRUCTION_ZONE_DETECTED" 31 "VEHICLE_SPEED_TEMPORARILY_LIMITED_FOR_SAFETY" 32 "PRESS_AND_HOLD_THE_BUTTON_TO_ACTIVATE_HIGHWAY_DRIVING_PILOT" 40 "HIGHWAY_DRIVING_PILOT_SYSTEM_IS_AVAILABLE" 64 "RESTART_VEHICLE_AFTER_EMERGENCY_STOP" 65 "CONNECTED_SERVICES_UNAVAILABLE" 66 "AVAILABLE_AFTER_VEHICLE_SOFTWARE_IS_UPDATED" 67 "ROAD_TYPE_NOT_SUPPORTED" 68 "ONLY_AVAILABLE_WHILE_DRIVING_ON_HIGHWAY_LANES" 69 "UNAVAILABLE_WHILE_OTHER_WARNINGS_ARE_ACTIVE" 70 "CANNOT_ACTIVATE_AT_ENTRANCE_EXIT_RAMPS" 71 "LANE_UNSUPPORTED" 72 "NOT_AVAILABLE_IN_THIS_COUNTRY" 79 "CHECKING_THE_DETECTION_RANGE_OF_THE_SENSOR" 80 "SHIFT_TO_D" 81 "ENGINE_STOPPED_BY_AUTO_STOP" 82 "INCREASE_DISTANCE_FROM_VEHICLE_AHEAD" 83 "VEHICLE_SPEED_IS_TOO_HIGH" 84 "CENTER_VEHICLE_IN_THE_LANE" 85 "PARKING_ASSIST_IS_ACTIVE" 86 "ESC_ACTIVIATION_REQUIRED" 87 "UNFOLD_SIDE_VIEW_MIRRORS" 88 "UNAVAILABLE_IN_THE_OUTER_LANE_AFTER_SUNSET" 89 "VEHICLE_SPEED_LIMITED_AFTER_SUNSET_FOR_SAFETY" 90 "LEADING_VEHICLE_NOT_DETECTED" 104 "AGGRESSIVE_BRAKING_OR_STEERING_DETECTED" 110 "SENSOR_AUTO_CALIBRATION_IN_PROGRESS_THIS_MAY_TAKE_SEVERAL_MINUTES" 111 "HIGHWAY_DRIVING_PILOT_WILL_BE_AVAILABLE_SHORTLY" 112 "IF_STEERING_WHEEL_IS_USED_HDP_WILL_BE_DEACTIVATED" 120 "IMPACT_DETECTED" 128 "UNSUITABLE_USE_OF_ACCELERATOR_PEDAL_DETECTED" 129 "GEAR_SHIFTER_USE_DETECTED" 130 "UNSUITABLE_BRAKE_PEDAL_USE_DETECTED" 131 "VEHICLE_START_BUTTON_PRESSED" 132 "VEHICLE_HAS_BEEN_STOPPED_FOR_TOO_LONG" 141 "TRAFFIC_CONGESTION_HAS_CLEARED" 142 "ENTRANCE_AND_EXIT_RAMPS_AHEAD" 143 "UNSUPPORTED_LANE_AHEAD" 144 "UNSUPPORTED_ROAD_TYPE_AHEAD" 145 "LANE_DEPARTURE_DETECTED" 146 "MAXIMUM_SPEED_EXCEEDED" 147 "HIGHWAY_DRIVING_PILOT_LIMITED_ABNORMAL_VEHICLE_CONTROLLER_STATUS" 148 "WIPER_LIGHT_CONTROL_SETTINGS_ARE_UNSUITABLE_FOR_USE_WITH_HDP" 149 "WINDSHIELD_DEFOG_SYSTEM_STATUS_IS_UNSUITABLE_FOR_USE_WITH_HDP" 150 "HAZARD_WARNING_LIGHTS_OR_TURN_SIGNAL_OPERATION_DETECTED" 151 "PERFORMING_EVASIVE_STEERING_OBSTACLES_DETECTED_AHEAD" 152 "HIGHWAY_DRIVING_PILOT_LIMITED_SENSOR_DETECTION_RANGE_LIMITED" 160 "CHECK_HIGHWAY_DRIVING_PILOT_SYSTEM" 161 "SAFETY_FUNCTION_ACTIVATED" 176 "CAMERA_OBSCURED" 177 "RADAR_BLOCKED" 178 "LIDAR_BLOCKED" 179 "AIRBAG_WARNING_LIGHT_IS_ON" 180 "ATTACHED_TRAILED_DETECTED" 181 "HIGH_OUTSIDE_TEMPERATURE" 182 "LOW_OUTSIDE_TEMPERATURE" 190 "UNAVAILABLE_DUE_TO_THE_ROAD_EVENT_INFORMATION_RECEIVED" 191 "UNAVAILABLE_NEAR_TOLLGATES" 192 "DRIVERS_SEAT_IS_NOT_IN_A_SAFE_DRIVING_POSITION" 193 "VEHICLE_DRIVING_THE_WRONG_WAY_DETECTED_AHEAD" 194 "EMERGENCY_VEHICLE_DETECTED" 195 "OBSTACLE_DETECTED_AHEAD" 196 "SENSOR_BLOCKED_DUE_TO_RAIN_SNOW_OR_ROAD_DEBRIS" 197 "SLIPPERY_ROAD_SURFACE_DETECTED" 198 "CONSTRUCTION_ZONE_DETECTED_AHEAD" 199 "PEDESTRIAN_DETECTED_AHEAD" 200 "UNSUITABLE_DRIVERS_SEAT_POSITION_DETECTED" 201 "FOLDED_SIDE_VIEW_MIRRORS_DETECTED" 208 "VEHICLE_POSITION_NOT_DETECTED" 209 "LANE_NOT_DETECTED" 210 "DRIVER_NOT_DETECTED" 211 "KEEP_YOUR_EYES_ON_THE_ROAD" 212 "LEADING_VEHICLE_REQUIRED_AFTER_SUNSET" 213 "TBD" 240 "LOW_FUEL" 241 "LOW_TIRE_PRESSURE" 242 "DOOR_OPEN" 243 "TRUNK_OPEN" 244 "HOOD_OPEN" 245 "SEAT_BELT_NOT_FASTENED" 246 "PARKING_BRAKE_ACTIVATED" 247 "LOW_EV_BATTERY" 248 "HDP_DEACTIVATION_DELAYED_RISK_OF_COLLISION_DETECTED" 249 "LIFTGATE_OPENED"; -VAL_ 353 ALERTS_5 0 "HIDDEN" 1 "DRIVERS_GRASP_NOT_DETECTED_DRIVING_SPEED_WILL_BE_LIMITED" 2 "WATCH_FOR_SURROUNDING_VEHICLES" 3 "SMART_CRUISE_CONTROL_DEACTIVATED" 4 "SMART_CRUISE_CONTROL_CONDITIONS_NOT_MET" 5 "USE_SWITCH_OR_PEDAL_TO_ACCELERATE" 6 "DRIVER_ASSISTNCE_SYSTEM_LIMITED_TRAILER_ATTACHED" 7 "DRIVER_ASSISTNCE_SYSTEM_LIMITED_DRIVER_FULL_FACE_NOT_VISIBLE" 11 "LEADING_VEHICLE_IS_DRIVING_AWAY" 12 "STOP_VEHICLE_THEN_TRY_AGAIN" 19 "ACTIVATING_HIGHWAY_DRIVING_PILOT_SYSTEM" 20 "CONTINUING_USE_OF_HIGHWAY_DRIVING_PILOT_WILL_RESULT_IN_DEVIATION_FROM_THE_NAVIGATION_ROUTE" 21 "HIGHWAY_DRIVING_PILOT_SYSTEM_DEACTIVATED_SILENT" 22 "HIGHWAY_DRIVING_PILOT_SYSTEM_NOT_APPLIED" 23 "HIGHWAY_DRIVING_PILOT_CONDITIONS_NOT_MET_SILENT"; -VAL_ 353 MUTE 0 "NONE" 1 "MUTED"; -VAL_ 353 SOUNDS_1 0 "NONE" 3 "FAST BEEP" 6 "CONSTANT BEEP"; -VAL_ 353 SOUNDS_2 0 "NONE" 2 "SINGLE CHIME" 3 "CONSTANT CHIME" 6 "FAST BEEP"; -VAL_ 353 SOUNDS_3 0 "NONE" 3 "SOFT CHIME" 5 "SINGLE CHIME"; -VAL_ 353 SOUNDS_4 0 "NONE" 2 "DOUBLE CHIME"; -VAL_ 353 SETSPEED_HUD 0 "HIDDEN" 1 "GRAY" 2 "GREEN" 3 "WHITE" 5 "CYAN"; -VAL_ 353 DISTANCE_LEAD 0 "HIDDEN" 1 "GRAY" 2 "WHITE"; -VAL_ 353 DISTANCE_CAR 0 "HIDDEN" 1 "GRAY" 2 "WHITE" 3 "CYAN A"; -VAL_ 353 DISTANCE_SPACING 0 "HIDDEN" 1 "BLUE" 3 "WHITE" 5 "CYAN"; -VAL_ 353 SETSPEED 0 "HIDDEN" 1 "GRAY" 2 "GREEN" 3 "WHITE" 6 "CYAN"; -VAL_ 353 HDA_ICON 0 "HIDDEN" 1 "GRAY" 2 "GREEN" 3 "WHITE" 5 "CYAN HDP"; -VAL_ 353 SLA_ICON 0 "HIDDEN" 1 "WHITE UP" 2 "WHITE DOWN" 3 "GREEN UP" 4 "GREEN DOWN"; -VAL_ 353 NAV_ICON 0 "HIDDEN" 1 "GRAY" 2 "GREEN" 4 "WHITE"; -VAL_ 353 LFA_ICON 0 "HIDDEN" 1 "GRAY" 2 "GREEN" 3 "WHITE" 5 "CYAN"; -VAL_ 353 LCA_LEFT_ICON 0 "HIDDEN" 1 "GRAY" 2 "GREEN" 4 "WHITE"; -VAL_ 353 LCA_RIGHT_ICON 0 "HIDDEN" 1 "GRAY" 2 "GREEN" 4 "WHITE"; -VAL_ 353 BACKGROUND 0 "HIDDEN" 1 "BLUE" 3 "ORANGE" 4 "FLASHING ORANGE" 6 "FLASHING RED" 7 "GRAY"; -VAL_ 353 DAW_ICON 0 "HIDDEN" 1 "ORANGE"; -VAL_ 353 CAR_CIRCLE 0 "HIDDEN" 1 "GRAY" 2 "CYAN"; -VAL_ 354 COUNTRY 0 "HIDDEN" 1 "SOUTH_KOREA" 4 "INTL" 5 "JAPAN" 6 "CANADA" 7 "USA" 8 "CHINA" 9 "INTL"; -VAL_ 354 SPEEDLIMIT_FLASH 0 "HIDDEN" 1 "ERROR" 2 "NORMAL" 4 "RED"; -VAL_ 354 SIGNS 0 "HIDDEN" 1 "PEDESTRIAN_CROSSING" 2 "SCHOOL_CROSSWALK" 8 "STOP" 9 "YIELD" 16 "DO_NOT_PASS" 19 "DO_NOT_ENTER" 24 "ROUNDABOUT" 26 "RIGHT_CURVE_AHEAD" 27 "LEFT_CURVE_AHEAD" 28 "SLIGHT_RIGHT_CURVE_AHEAD" 29 "SLIGHT_LEFT_CURVE_AHEAD"; -VAL_ 354 SPEEDLIMIT_WEATHER 0 "HIDDEN" 1 "RAIN" 2 "SNOW" 3 "RAIN+SNOW" 4 "TRAILER"; -VAL_ 354 VIBRATE 0 "NONE" 1 "VIBRATE"; -VAL_ 354 LEAD 0 "HIDDEN" 1 "GRAY BOX" 2 "WHITE BOX" 3 "GRAY CAR" 4 "WHITE CAR" 5 "GRAY TRUCK" 6 "WHITE TRUCK" 7 "GRAY PERSON" 8 "WHITE PERSON" 9 "GRAY BICYCLE" 10 "WHITE BICYCLE" 11 "GRAY MOTORCYCLE" 12 "WHITE MOTORCYCLE" 13 "DARK CONE" 14 "ORANGE CONE"; -VAL_ 354 LEAD_ALT 0 "HIDDEN" 1 "GRAY BOX" 2 "WHITE BOX" 3 "DIM CONE" 4 "ORANGE CONE"; -VAL_ 354 LEAD_LEFT 0 "HIDDEN" 1 "GRAY BOX" 2 "WHITE BOX" 3 "GRAY CAR" 4 "WHITE CAR" 5 "GRAY TRUCK" 6 "WHITE TRUCK" 7 "GRAY PERSON" 8 "WHITE PERSON" 9 "GRAY BICYCLE" 10 "WHITE BICYCLE" 11 "GRAY MOTORCYCLE" 12 "WHITE MOTORCYCLE" 13 "DARK CONE" 14 "ORANGE CONE"; -VAL_ 354 LEAD_RIGHT 0 "HIDDEN" 1 "GRAY BOX" 2 "WHITE BOX" 3 "GRAY CAR" 4 "WHITE CAR" 5 "GRAY TRUCK" 6 "WHITE TRUCK" 7 "GRAY PERSON" 8 "WHITE PERSON" 9 "GRAY BICYCLE" 10 "WHITE BICYCLE" 11 "GRAY MOTORCYCLE" 12 "WHITE MOTORCYCLE" 13 "DARK CONE" 14 "ORANGE CONE"; -VAL_ 354 FAULT_FSS 0 "HIDDEN" 1 "CHECK_FORWARD_SAFETY_SYSTEM" 2 "FORWARD_SAFETY_SYSTEM_LIMITED_CAMERA_OBSCURED" 3 "FORWARD_SAFETY_SYSTEM_LIMITED_RADAR_BLOCKED"; -VAL_ 354 FAULT_FCA 0 "HIDDEN" 1 "CHECK_FORWARD_SIDE_SAFETY_SYSTEM" 2 "FORWARD_SIDE_SAFETY_SYSTEM_LIMITED_CAMERA_OBSCURED" 3 "FORWARD_SIDE_SAFETY_SYSTEM_LIMITED_RADAR_BLOCKED"; -VAL_ 354 FAULT_LSS 0 "HIDDEN" 1 "CHECK_LANE_SAFETY_SYSTEM" 2 "LANE_SAFETY_SYSTEM_DISABLED_CAMERA_OBSCURED"; -VAL_ 354 FAULT_SLA 0 "HIDDEN" 1 "CHECK_SPEED_LIMIT_SYSTEM" 2 "SPEED_LIMIT_SYSTEM_DISABLED_CAMERA_OBSCURED"; -VAL_ 354 FAULT_DAW 0 "HIDDEN" 1 "CHECK_INATTENTIVE_DRIVING_WARNING_SYSTEM" 2 "INATTENTIVE_DRIVING_WARNING_SYSTEM_DISABLED_CAMERA_OBSCURED"; -VAL_ 354 FAULT_HBA 0 "HIDDEN" 1 "CHECK_HIGH_BEAM_ASSIST_SYSTEM"; -VAL_ 354 FAULT_SCC 0 "HIDDEN" 1 "CHECK_SMART_CRUISE_CONTROL_SYSTEM" 2 "SMART_CRUISE_CONTROL_DISABLED_RADAR_BLOCKED"; -VAL_ 354 FAULT_LFA 0 "HIDDEN" 1 "CHECK_LANE_FOLLOWING_SYSTEM_ASSIST_SYSTEM"; -VAL_ 354 FAULT_HDA 0 "HIDDEN" 1 "CHECK_HIGHWAY_DRIVING_ASSIST_SYSTEM"; -VAL_ 354 FAULT_LCA 0 "HIDDEN" 1 "CHECK_LANE_CHANGE_ASSIST_FUNCTION" 2 "LANE_CHANGE_ASSIST_FUNCTION_DISABLED_CAMERA_OBSCURED" 3 "LANE_CHANGE_ASSIST_FUNCTION_DISABLED_RADAR_BLOCKED"; -VAL_ 354 FAULT_HDP 0 "HIDDEN" 1 "CHECK_HIGHWAY_DRIVING_PILOT_SYSTEM" 2 "HIGHWAY_DRIVING_PILOT_DISABLED_CAMERA_OBSCURED" 3 "HIGHWAY_DRIVING_PILOT_DISABLED_RADAR_BLOCKED" 4 "HIGHWAY_DRIVING_PILOT_DISABLED_LIDAR_BLOCKED"; -VAL_ 354 FAULT_DAS 0 "HIDDEN" 1 "CHECK_DRIVER_ASSISTANCE_SYSTEM" 2 "DRIVER_ASSISTANCE_SYSTEM_LIMITED_CAMERA_OBSCURED" 3 "DRIVER_ASSISTANCE_SYSTEM_LIMITED_RADAR_BLOCKED" 4 "DRIVER_ASSISTANCE_SYSTEM_LIMITED_CAMERA_OBSCURED_AND_RADAR_BLOCKED"; -VAL_ 354 FAULT_ESS 0 "HIDDEN" 1 "CHECK_EMERGENCY_STOPPING_FUNCTION" 2 "EMERGENCY_STOPPING_FUNCTION_DISABLED_CAMERA_OBSCURED" 3 "EMERGENCY_STOPPING_FUNCTION_DISABLED_RADAR_BLOCKED"; +VAL_ 304 GEAR 1 "P" 2 "R" 3 "N" 4 "D" ; +VAL_ 352 AEB_SETTING 1 "off" 2 "warning only" 3 "active assist" ; VAL_ 362 BLINKER_CONTROL 1 "hazards" 2 "hazards button backlight" 3 "left blinkers" 4 "right blinkers"; VAL_ 373 ACCEnable 0 "SCC ready" 1 "SCC temp fault" 2 "SCC permanent fault" 3 "SCC permanent fault, communication issue"; -VAL_ 416 ACCMode 0 "off" 1 "enabled" 2 "driver_override" 3 "off_maybe_fault" 4 "cancelled"; -VAL_ 426 CRUISE_BUTTONS 0 "none" 1 "res_accel" 2 "set_decel" 3 "gap_distance" 4 "pause_resume"; -VAL_ 463 CRUISE_BUTTONS 0 "none" 1 "res_accel" 2 "set_decel" 3 "gap_distance" 4 "pause_resume"; +VAL_ 416 ACCMode 0 "off" 1 "enabled" 2 "driver_override" 3 "off_maybe_fault" 4 "cancelled" ; +VAL_ 426 CRUISE_BUTTONS 0 "none" 1 "res_accel" 2 "set_decel" 3 "gap_distance" 4 "pause_resume" ; +VAL_ 463 CRUISE_BUTTONS 0 "none" 1 "res_accel" 2 "set_decel" 3 "gap_distance" 4 "pause_resume" ; VAL_ 463 RIGHT_PADDLE 0 "Not Pulled" 1 "Pulled"; VAL_ 463 LEFT_PADDLE 0 "Not Pulled" 1 "Pulled"; +VAL_ 676 LEFT_LANE_LINE 0 "Not Detected" 1 "Low Confidence" 2 "Medium Confidence" 3 "High Confidence"; +VAL_ 676 RIGHT_LANE_LINE 0 "Not Detected" 1 "Low Confidence" 2 "Medium Confidence" 3 "High Confidence"; VAL_ 736 MSLA_STATUS 0 "disabled" 1 "active" 2 "paused"; VAL_ 866 LEFT_LANE_LINE 0 "Not Detected" 1 "Low Confidence" 2 "Medium Confidence" 3 "High Confidence"; VAL_ 866 RIGHT_LANE_LINE 0 "Not Detected" 1 "Low Confidence" 2 "Medium Confidence" 3 "High Confidence"; VAL_ 1041 DRIVER_DOOR 0 "Closed" 1 "Opened"; VAL_ 1041 PASSENGER_DOOR 0 "Closed" 1 "Opened"; -VAL_ 1041 PASSENGER_SEATBELT 0 "Unlatched" 1 "Latched"; -VAL_ 1041 DRIVER_SEATBELT 0 "Unlatched" 1 "Latched"; VAL_ 1041 DRIVER_REAR_DOOR 0 "Closed" 1 "Opened"; VAL_ 1041 PASSENGER_REAR_DOOR 0 "Closed" 1 "Opened"; +VAL_ 1041 DRIVER_SEATBELT 0 "Unlatched" 1 "Latched"; +VAL_ 1041 PASSENGER_SEATBELT 0 "Unlatched" 1 "Latched"; VAL_ 1144 DRIVE_MODE2 3 "Set Sport" 1 "Set Normal" 2 "Set Eco"; VAL_ 1240 DISTANCE_UNIT 1 "Miles" 0 "Kilometers"; diff --git a/opendbc/dbc/hyundai_kia_generic.dbc b/opendbc/dbc/hyundai_kia_generic.dbc index f94511ad42d..d8314a45d91 100644 --- a/opendbc/dbc/hyundai_kia_generic.dbc +++ b/opendbc/dbc/hyundai_kia_generic.dbc @@ -1496,7 +1496,7 @@ BO_ 1157 LFAHDA_MFC: 4 XXX BO_ 913 BCM_PO_11: 8 Vector__XXX SG_ BCM_Door_Dri_Status : 5|1@0+ (1,0) [0|1] "" PT_ESC_ABS SG_ BCM_Shift_R_MT_SW_Status : 39|2@0+ (1,0) [0|3] "" PT_ESC_ABS - SG_ LDA_BTN : 4|1@0+ (1,0) [0|1] "" XXX + SG_ LFA_Pressed : 4|1@0+ (1,0) [0|1] "" XXX BO_ 1426 LABEL11: 8 XXX SG_ CC_React : 34|1@1+ (1,0) [0|1] "" XXX diff --git a/opendbc/dbc/rivian_primary_actuator.dbc b/opendbc/dbc/rivian_can.dbc similarity index 98% rename from opendbc/dbc/rivian_primary_actuator.dbc rename to opendbc/dbc/rivian_can.dbc index 686ec6fe323..dd6821a3db9 100644 --- a/opendbc/dbc/rivian_primary_actuator.dbc +++ b/opendbc/dbc/rivian_can.dbc @@ -185,7 +185,7 @@ BO_ 354 VDM_AdasSts: 8 VDM SG_ VDM_AdasStatus_Checksum : 7|8@0+ (1,0) [0|0] "" ACM SG_ VDM_AdasStatus_Counter : 11|4@0+ (1,0) [0|0] "" ACM SG_ VDM_AdasDecelLimit : 17|10@0+ (0.01,0) [0|10.23] "m/s^2" ACM - SG_ VDM_AdasDriverAccelPriorityStatus : 19|2@0+ (1,0) [0|3] "" ACM + SG_ VDM_AdasDriverAccelPriorityStatu : 19|2@0+ (1,0) [0|3] "" ACM SG_ VDM_AdasFaultStatus : 23|4@0+ (1,0) [0|15] "" ACM SG_ VDM_AdasAccelLimit : 33|10@0+ (0.01,0) [0|10.23] "m/s^2" ACM SG_ VDM_AdasDriverModeStatus : 36|3@0+ (1,0) [0|7] "" ACM @@ -226,6 +226,10 @@ BO_ 448 ESP_TorqueLimit_Rear: 8 ESP SG_ ESP_Torque_Rear_Max : 23|16@0+ (0.5,-16384) [-16384|16383] "Nm" VDM SG_ ESP_Torque_Rear_Min : 39|16@0+ (0.5,-16384) [-16384|16383] "Nm" VDM +BO_ 496 NEW_MSG_1F0: 8 XXX + +BO_ 515 NEW_MSG_203: 8 XXX + BO_ 516 RCM_ALR_Status: 8 RCM SG_ RCM_ALR_Status_Signal : 0|2@1+ (1,0) [0|3] "" OCS @@ -323,10 +327,6 @@ BO_ 530 VDM_Torque_Rear: 8 VDM BO_ 565 IndicatorLights: 8 XXX SG_ checksum : 0|8@1+ (1,0) [0|255] "" XXX SG_ counter : 8|4@1+ (1,0) [0|15] "" XXX - SG_ RearDriverDoor : 24|2@0+ (1,0) [0|3] "" XXX - SG_ FrontPassengerDoor : 26|2@0+ (1,0) [0|3] "" XXX - SG_ DriverDoor : 28|2@0+ (1,0) [0|3] "" XXX - SG_ RearPassengerDoor : 38|2@0+ (1,0) [0|3] "" XXX SG_ TurnLightLeft : 40|2@0+ (1,0) [0|3] "" XXX SG_ TurnLightRight : 54|2@0+ (1,0) [0|3] "" XXX @@ -336,16 +336,11 @@ BO_ 592 VDM_EcasStatus: 8 VDM SG_ VDM_EcasHeightRL : 23|8@0- (1,0) [-128|127] "mm" ACM SG_ VDM_EcasHeightRR : 31|8@0- (1,0) [-128|127] "mm" ACM +BO_ 658 NEW_MSG_292: 8 XXX + BO_ 789 BCM_Status: 8 VDM SG_ BCM_AmbientAirTemperature : 15|8@0- (1,0) [-60|100] "degC" ESP -BO_ 801 SCCM_WheelTouch: 7 SCCM - SG_ SCCM_WheelTouch_Checksum : 7|8@0+ (1,0) [0|255] "" XXX - SG_ SCCM_WheelTouch_Counter : 11|4@0+ (1,0) [0|15] "" XXX - SG_ SCCM_WheelTouch_HandsOn : 21|1@0+ (1,0) [0|1] "" XXX - SG_ SETME_X52 : 31|8@0+ (1,0) [0|255] "" XXX - SG_ SCCM_WheelTouch_CapacitiveValue : 32|12@1+ (1,0) [0|4095] "" XXX - BO_ 811 ESP_EpbStatus: 8 ESP SG_ ESP_EpbStatus_Checksum : 7|8@0+ (1,0) [0|255] "" ACM,VDM SG_ ESP_EpbStatus_Counter : 11|4@0+ (1,0) [0|15] "" ACM,VDM @@ -517,6 +512,9 @@ BO_ 1330 Dummy_VDM_PrimaryActuatorCAN: 1 VDM BO_ 1535 DoorStatus: 8 XXX SG_ DoorOpen : 8|1@0+ (1,0) [0|1] "" XXX +BO_ 1536 NEW_MSG_600: 3 XXX + SG_ NEW_SIGNAL_1 : 15|1@0+ (1,0) [0|1] "" XXX + BO_ 1545 XCP_Cmd_VDM: 8 TestTool BO_ 1609 XCP_Resp_VDM: 8 VDM @@ -561,7 +559,6 @@ BO_ 1909 Diag_PhysResp_ESP_PrimaryActuato: 8 ESP BO_ 1910 Diag_PhysResp_IBM_PrimaryActuato: 8 IBM CM_ BO_ 64 "External steering angle sensor message."; -CM_ BO_ 801 "Not a reference message. Suspected ECU source is SCCM (Steering Column Control Module). Used by ACM to show hold wheel message on ACC engagement."; CM_ SG_ 64 SAS_Status_Checksum "Actual steering wheel angle from the actual centre position of the steering wheel. The signal value is a signed value from zero (at centre steering wheel position) where a left turn (counterclockwise from steering wheel centre position) is represented by positive values and right turn (clockwise from steering wheel centre position) will have negative value. Checksum for steering wheel sensor data."; CM_ SG_ 64 SAS_Status_Counter "Actual steering wheel angle from the actual centre position of the steering wheel. The signal value is a signed value from zero (at centre steering wheel position) where a left turn (counterclockwise from steering wheel centre position) is represented by positive values and right turn (clockwise from steering wheel centre position) will have negative value. Counter value for steering wheel sensor data."; CM_ SG_ 64 SAS_Status_AngleSafe "Actual steering wheel angle from the actual centre position of the steering wheel. The signal value is a signed value from zero (at centre steering wheel position) where a left turn (counterclockwise from steering wheel centre position) is represented by positive values and right turn (clockwise from steering wheel centre position) will have negative value. Actual steering wheel angle from the actual centre position of the steering wheel. The signal value is a signed value from zero (at centre steering wheel"; @@ -874,7 +871,7 @@ VAL_ 352 ACM_VehicleHoldRequired 0 "ACM_VEHICLEHOLDREQ_NO_REQUEST" 1 "ACM_VEHICL VAL_ 352 ACM_PrndRequired 0 "ACM_PRNDREQ_PARK" 1 "ACM_PRNDREQ_REVERSE" 2 "ACM_PRNDREQ_NEUTRAL" 3 "ACM_PRNDREQ_DRIVE" 4 "ACM_PRNDREQ_NOT_USED"; VAL_ 352 ACM_longInterfaceEnable 0 "ACM_LONGIFEN_INIT" 1 "ACM_LONGIFEN_LONGITUDINAL_INTERFACE_ENABLE" 2 "ACM_LONGIFEN_LONGITUDINAL_INTERFACE_DISABLE" 3 "ACM_LONGIFEN_SNA"; VAL_ 352 ACM_AccelerationRequestType 0 "ACM_ACCELREQTYPE_INIT" 1 "ACM_ACCELREQTYPE_ACCEL_NEGATIVE" 2 "ACM_ACCELREQTYPE_ACCEL_POSITIVE" 3 "ACM_ACCELREQTYPE_SNA"; -VAL_ 354 VDM_AdasDriverAccelPriorityStatus 0 "VDM_AdasDriverAccelPriorityStatus_Driver" 1 "VDM_AdasDriverAccelPriorityStatus_Adas"; +VAL_ 354 VDM_AdasDriverAccelPriorityStatu 0 "VDM_AdasDriverAccelPriorityStatus_Driver" 1 "VDM_AdasDriverAccelPriorityStatus_Adas"; VAL_ 354 VDM_AdasFaultStatus 0 "VDM_AdasFlaultStatus_No_Fault" 1 "VDM_AdasFaultStatus_Brk_Intv" 2 "VDM_AdasFlaultStatus_Cntr_Fault" 3 "VDM_AdasFlaultStatus_Imps_Cmd" 15 "VDM_AdasFlaultStatus_Sna"; VAL_ 354 VDM_AdasDriverModeStatus 0 "VDM_AdasDriverModeStatus_Human" 1 "VDM_AdasDriverModeStatus_Adas" 2 "VDM_AdasDriverModeStatus_Reserved" 3 "VDM_AdasDriverModeStatus_Sna"; VAL_ 354 VDM_AdasInterfaceStatus 0 "VDM_AdasInterfaceStatus_Unavailable" 1 "VDM_AdasInterfaceStatus_Available" 2 "VDM_AdasInterfaceStatus_Enabled" 3 "VDM_AdasInterfaceStatus_Faulted"; @@ -931,10 +928,6 @@ VAL_ 529 VDM_Torque_Front_MinQ 0 "VDM_Torque_Front_MinQ_Invalid" 1 "VDM_Torque_F VAL_ 530 VDM_Torque_Rear_MaxQ 0 "VDM_Torque_Rear_MaxQ_Invalid" 1 "VDM_Torque_Rear_MaxQ_Valid"; VAL_ 530 VDM_OutputTorqueRearQ 0 "VDM_OutputTorqueRearQ_Invalid" 1 "VDM_OutputTorqueRearQ_Valid"; VAL_ 530 VDM_Torque_Rear_MinQ 0 "VDM_Torque_Rear_MinQ_Invalid" 1 "VDM_Torque_Rear_MinQ_Valid"; -VAL_ 565 RearDriverDoor 0 "SNA" 1 "Open" 2 "Closed" 3 "SNA"; -VAL_ 565 FrontPassengerDoor 0 "SNA" 1 "Open" 2 "Closed" 3 "SNA"; -VAL_ 565 DriverDoor 0 "SNA" 1 "Open" 2 "Closed" 3 "SNA"; -VAL_ 565 RearPassengerDoor 0 "SNA" 1 "Open" 2 "Closed" 3 "SNA"; VAL_ 811 ESP_EpbAvailable 0 "ESP_EpbAvailable_Not_Available" 1 "ESP_EpbAvailable_Available"; VAL_ 811 ESP_EpbServiceMode 0 "ESP_EpbServiceMode_Not_Active" 1 "ESP_EpbServiceMode_Active"; VAL_ 811 ESP_EpbWarningLamp 0 "ESP_EpbWarningLamp_Off" 1 "ESP_EpbWarningLamp_Continous" 2 "ESP_EpbWarningLamp_Blink" 3 "ESP_EpbWarningLamp_Sna"; diff --git a/opendbc/dbc/vw_meb.dbc b/opendbc/dbc/vw_meb.dbc deleted file mode 100644 index 98125aaa691..00000000000 --- a/opendbc/dbc/vw_meb.dbc +++ /dev/null @@ -1,3408 +0,0 @@ -VERSION "" - - -NS_ : - NS_DESC_ - CM_ - BA_DEF_ - BA_ - VAL_ - CAT_DEF_ - CAT_ - FILTER - BA_DEF_DEF_ - EV_DATA_ - ENVVAR_DATA_ - SGTYPE_ - SGTYPE_VAL_ - BA_DEF_SGTYPE_ - BA_SGTYPE_ - SIG_TYPE_REF_ - VAL_TABLE_ - SIG_GROUP_ - SIG_VALTYPE_ - SIGTYPE_VALTYPE_ - BO_TX_BU_ - BA_DEF_REL_ - BA_REL_ - BA_DEF_DEF_REL_ - BU_SG_REL_ - BU_EV_REL_ - BU_BO_REL_ - SG_MUL_VAL_ - -BS_: - -BU_: BAP_Tester BedienDisp_vo BedienSG_hi CGS DDA Gateway Gateway_PAG GurtMikrofon OTA_FC ZR_High ZR_LIMU ZR_MIB_TOP_ab_Gen3 ZR_Standard - - -BO_ 64 Airbag_01: 8 Gateway - SG_ Airbag_01_CRC : 0|8@1+ (1,0) [0|255] "" AWC,BMC_MLBevo,BMS_NV,DCDC_800V_PAG,DCDC_HV,DCDC_HV_02,DCDC_IHEV,FCU_MLBevo_FCEV,Ladegeraet_2,Ladegeraet_Konzern,Sub_Gateway - SG_ Airbag_01_BZ : 8|4@1+ (1,0) [0|15] "" AWC,BMC_MLBevo,BMS_NV,DCDC_800V_PAG,DCDC_HV,DCDC_HV_02,DCDC_IHEV,FCU_MLBevo_FCEV,Ladegeraet_2,Ladegeraet_Konzern,Sub_Gateway - SG_ AB_RGS_Anst : 12|4@1+ (1,0) [0|15] "" FCU_MLBevo_FCEV,Sub_Gateway - SG_ AB_Front_Crash : 16|1@1+ (1,0) [0|1] "" FCU_MLBevo_FCEV,Sub_Gateway - SG_ AB_Heck_Crash : 17|1@1+ (1,0) [0|1] "" FCU_MLBevo_FCEV,Sub_Gateway - SG_ AB_SF_Crash : 18|1@1+ (1,0) [0|1] "" FCU_MLBevo_FCEV,Sub_Gateway - SG_ AB_SB_Crash : 19|1@1+ (1,0) [0|1] "" FCU_MLBevo_FCEV,Sub_Gateway - SG_ AB_Rollover_Crash : 20|1@1+ (1,0) [0|1] "" FCU_MLBevo_FCEV,Sub_Gateway - SG_ AB_Crash_Int : 21|3@1+ (1,0) [0|7] "" FCU_MLBevo_FCEV,Sub_Gateway,TME - SG_ AB_Lampe : 24|1@1+ (1,0) [0|1] "" FCU_MLBevo_FCEV,Sub_Gateway - SG_ AB_Deaktiviert : 25|1@1+ (1,0) [0|1] "" FCU_MLBevo_FCEV,Sub_Gateway - SG_ AB_VB_deaktiviert : 26|1@1+ (1,0) [0|1] "" FCU_MLBevo_FCEV,Sub_Gateway - SG_ AB_Systemfehler : 27|1@1+ (1,0) [0|1] "" FCU_MLBevo_FCEV,Sub_Gateway - SG_ AB_Diagnose : 28|1@1+ (1,0) [0|1] "" FCU_MLBevo_FCEV,Sub_Gateway - SG_ AB_Stellgliedtest : 29|1@1+ (1,0) [0|1] "" FCU_MLBevo_FCEV,Sub_Gateway,TME - SG_ AB_Erh_Auf_VB : 30|2@1+ (1,0) [0|3] "" FCU_MLBevo_FCEV,Sub_Gateway - SG_ AB_Gurtwarn_VF : 32|1@1+ (1,0) [0|1] "" FCU_MLBevo_FCEV,Sub_Gateway - SG_ AB_Gurtwarn_VB : 33|1@1+ (1,0) [0|1] "" FCU_MLBevo_FCEV,Sub_Gateway - SG_ AB_Anzeige_Fussg : 34|2@1+ (1,0) [0|3] "" FCU_MLBevo_FCEV,Sub_Gateway - SG_ AB_Texte_AKS : 36|2@1+ (1,0) [0|3] "" FCU_MLBevo_FCEV,Sub_Gateway - SG_ AB_MKB_gueltig : 39|1@1+ (1,0) [0|1] "" FCU_MLBevo_FCEV,Sub_Gateway - SG_ AB_MKB_Anforderung : 40|1@1+ (1,0) [0|1] "" FCU_MLBevo_FCEV,Sub_Gateway - SG_ AB_Versorgungsspannung : 41|1@1+ (1,0) [0|1] "" FCU_MLBevo_FCEV,Sub_Gateway - SG_ AB_Deaktivierung_HV : 42|3@1+ (1,0) [0|7] "" AWC,BMC_MLBevo,BMS_NV,DCDC_800V_PAG,DCDC_HV,DCDC_HV_02,DCDC_IHEV,FCU_MLBevo_FCEV,Ladegeraet_2,Ladegeraet_Konzern,Sub_Gateway,TME - SG_ AB_EDR_Trigger : 45|2@1+ (1,0) [0|3] "" FCU_MLBevo_FCEV,Sub_Gateway - SG_ AB_Belegung_VF : 47|2@1+ (1,0) [0|3] "" FCU_MLBevo_FCEV,Sub_Gateway - SG_ SC_Masterzeit_Offset : 53|2@1+ (5.08,0) [0|15.24] "Unit_Secon" FCU_MLBevo_FCEV,Sub_Gateway - SG_ SC_LowSpeedCrashErkannt : 55|2@1+ (1,0) [0|3] "" FCU_MLBevo_FCEV,Sub_Gateway - SG_ SC_Masterzeit : 57|7@1+ (0.04,0) [0|5.04] "Unit_Secon" FCU_MLBevo_FCEV,Sub_Gateway - -BO_ 134 LWI_01: 8 Gateway - SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" Vector__XXX - SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" Vector__XXX - SG_ LWI_Sensorstatus : 12|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard - SG_ LWI_QBit_Sub_Daten : 13|1@1+ (1,0) [0|1] "" ZR_High - SG_ LWI_MFL_Abschaltung : 14|1@1+ (1,0) [0|1] "" ZR_High - SG_ LWI_QBit_Lenkradwinkel : 15|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard - SG_ LWI_Lenkradwinkel : 16|13@1+ (0.0843,0) [0|800] "Unit_DegreOfArc" OTA_FC,ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard - SG_ LWI_VZ_Lenkradwinkel : 29|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard - SG_ LWI_VZ_Lenkradw_Geschw : 30|1@1+ (1,0) [0|1] "" ZR_High - SG_ LWI_Lenkradw_Geschw : 31|9@1+ (5,0) [0|2500] "Unit_DegreOfArcPerSecon" OTA_FC,ZR_High - SG_ LWI_Sub_Daten : 40|16@1+ (1,0) [0|65535] "" Vector__XXX - -BO_ 159 LH_EPS_03: 8 XXX - SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX - SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX - SG_ EPS_DSR_Status : 12|4@1+ (1,0) [0|15] "" XXX - SG_ EPS_Berechneter_LW : 16|12@1+ (0.15,0) [0|613.95] "Unit_DegreOfArc" XXX - SG_ EPS_BLW_QBit : 30|1@1+ (1,0) [0|1] "" XXX - SG_ EPS_VZ_BLW : 31|1@1+ (1,0) [0|1] "" XXX - SG_ EPS_HCA_Status : 32|4@1+ (1,0) [0|15] "" XXX - SG_ EPS_Lenkmoment : 40|10@1+ (1,0) [0|8] "Unit_centiNewtoMeter" XXX - SG_ EPS_Lenkmoment_QBit : 54|1@1+ (1,0) [0|1] "" XXX - SG_ EPS_VZ_Lenkmoment : 55|1@1+ (1,0) [0|1] "" XXX - SG_ EPS_Lenkungstyp : 60|4@1+ (1,0) [0|15] "" XXX - -BO_ 167 Motor_11: 8 Motor_Diesel_MQB - SG_ Motor_11_CRC : 0|8@1+ (1,0) [0|255] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB - SG_ Motor_11_BZ : 8|4@1+ (1,0) [0|15] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB - SG_ MO_Mom_Soll_Roh : 12|10@1+ (1,-509) [-509|509] "Unit_NewtoMeter" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB - SG_ MO_Mom_Ist_Summe : 22|10@1+ (1,-509) [-509|509] "Unit_NewtoMeter" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,SAK_MQB - SG_ MO_Mom_Traegheit_Summe : 32|10@1+ (1,-509) [-509|509] "Unit_NewtoMeter" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB - SG_ MO_Mom_Soll_gefiltert : 42|10@1+ (1,-509) [-509|509] "Unit_NewtoMeter" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB - SG_ MO_Mom_Schub : 52|9@1+ (1,-509) [-509|0] "Unit_NewtoMeter" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB - SG_ MO_Status_Normalbetrieb_01 : 61|1@1+ (1,0) [0|1] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB - SG_ MO_erste_Ungenauschwelle : 62|1@1+ (1,0) [0|1] "" Gateway_MQB - SG_ MO_QBit_Motormomente : 63|1@1+ (1,0) [0|1] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB - -BO_ 168 Motor_12: 8 Motor_Diesel_MQB - SG_ Motor_12_CRC : 0|8@1+ (1,0) [0|255] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,LEH_MQB - SG_ Motor_12_BZ : 8|4@1+ (1,0) [0|15] "" BMS_MQB,Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,LEH_MQB - SG_ MO_Mom_neg_verfuegbar : 12|9@1+ (1,-509) [-509|0] "Unit_NewtoMeter" Gateway_MQB - SG_ MO_Mom_Begr_stat : 21|9@1+ (1,0) [0|509] "Unit_NewtoMeter" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB - SG_ MO_Mom_Begr_dyn : 30|10@1+ (1,-509) [-509|509] "Unit_NewtoMeter" Gateway_MQB - SG_ MO_Momentenintegral_02 : 40|7@1+ (1,0) [0|100] "Unit_PerCent" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB - SG_ MO_QBit_Drehzahl_01 : 47|1@1+ (1,0) [0|1] "" BMS_MQB,Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,LEH_MQB - SG_ MO_Drehzahl_01 : 48|16@1+ (0.25,0) [0|16383] "Unit_MinutInver" BMS_MQB,Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,LEH_MQB,SAK_MQB - -BO_ 173 Getriebe_11: 8 Gateway - SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" Vector__XXX - SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" Vector__XXX - SG_ GE_MMom_Soll_02 : 12|10@1+ (1,-509) [-509|509] "" Vector__XXX - SG_ GE_MMom_Vorhalt_02 : 22|10@1+ (1,-509) [-509|509] "" Vector__XXX - SG_ GE_Uefkt : 32|10@1+ (0.1,0) [0|102.2] "" Vector__XXX - SG_ GE_Fahrstufe : 42|4@1+ (1,0) [0|15] "" DDA,OTA_FC,ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3 - SG_ GE_reserv_Fahrstufe : 46|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ GE_Schaltablauf : 47|2@1+ (1,0) [0|3] "" Vector__XXX - SG_ GE_Uefkt_unplausibel : 49|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ GE_MMom_Status_02 : 50|3@1+ (1,0) [0|7] "" Vector__XXX - SG_ GE_Status_Kraftschluss : 53|3@1+ (1,0) [0|7] "" Vector__XXX - SG_ GE_MMom_Status : 56|2@1+ (1,0) [0|3] "" Vector__XXX - SG_ GE_Freig_MMom_Vorhalt : 58|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ GE_Verbot_Ausblendung : 59|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ GE_Zielgang : 60|4@1+ (1,0) [0|15] "" OTA_FC,ZR_High - -BO_ 184 EM1_HYB_13: 8 Gateway - SG_ EM1_Freigabe_Info_WFS : 12|1@1+ (1,0) [0|1] "" Sub_Gateway - SG_ EM1_Sperr_Info_WFS : 13|1@1+ (1,0) [0|1] "" Sub_Gateway - SG_ EM1_AR_aktiv : 14|1@1+ (1,0) [0|1] "" Sub_Gateway - SG_ EM1_Eta_Sys : 15|9@1+ (0.2,0) [0|101.8] "Unit_PerCent" Sub_Gateway - SG_ EM1_IstStrom : 24|11@1+ (1,-1023) [-1023|1022] "Unit_Amper" Sub_Gateway - SG_ EM1_Fehler_ElAntriebFreilauf_Anf : 35|1@1+ (1,0) [0|1] "" Sub_Gateway - SG_ EM1_Abregelung_Temperatur : 36|1@1+ (1,0) [0|1] "" Sub_Gateway - SG_ EM1_AnlernenElMotor_Anf : 43|1@1+ (1,0) [0|1] "" Sub_Gateway - SG_ EM1_Moment_HVVerbraucher : 44|10@1+ (1,-511) [-511|511] "Unit_NewtoMeter" Sub_Gateway - SG_ EM1_Freigabe_Verfallsinfo_WFS : 55|1@1+ (1,0) [0|1] "" Sub_Gateway - SG_ EM1_Parken_WFS_Status : 56|2@1+ (1,0) [0|3] "" Sub_Gateway - SG_ EM1_HV_betriebsbereit : 58|1@1+ (1,0) [0|1] "" Sub_Gateway - -BO_ 190 MEB_HVEM_01: 48 XXX - SG_ CRC : 0|8@1+ (1,0) [0|255] "" XXX - SG_ CNT : 8|4@1+ (1,0) [0|15] "" XXX - SG_ Engine_RPM_Max : 12|14@1+ (2,-9658) [0|15] "RPM" XXX - SG_ Engine_RPM_Min : 26|14@1+ (2,-10300) [0|63] "RPM" XXX - SG_ In_Motion_04 : 48|3@1+ (1,0) [0|7] "" XXX - SG_ In_Motion_03 : 52|1@0+ (1,0) [0|1] "" XXX - SG_ In_Motion_02 : 54|1@0+ (1,0) [0|1] "" XXX - SG_ Engine_Power : 56|12@1+ (0.5,-1023) [0|255] "kW" XXX - SG_ In_Motion : 68|1@1+ (1,0) [0|3] "" XXX - SG_ Standstill : 71|1@0+ (1,0) [0|1] "" XXX - SG_ Unknown_04 : 72|10@1+ (1,0) [0|255] "" XXX - SG_ Battery_Voltage : 86|12@1+ (0.2,0) [0|3] "Volt" XXX - SG_ Unknown_01 : 100|9@1+ (1,0) [0|7] "" XXX - SG_ Battery_Voltage_02 : 113|11@1+ (0.24,0) [0|127] "Volt" XXX - SG_ Engine_Status : 296|2@1+ (1,0) [0|3] "" XXX - SG_ Inactive : 300|1@0+ (1,0) [0|1] "" XXX - SG_ Inactive_02 : 303|1@0+ (1,0) [0|1] "" XXX - -BO_ 192 EM1_01: 32 XXX - SG_ Schubbetrieb : 79|1@0+ (1,0) [0|1] "" XXX - -BO_ 219 AWV_03: 48 XXX - SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX - SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX - SG_ FCW_Active : 64|1@0+ (1,0) [0|1] "" XXX - SG_ Pre_Brake_Fill : 76|1@0+ (1,0) [0|1] "" XXX - -BO_ 247 MEB_HVEM_02: 8 XXX - SG_ CRC : 0|8@1+ (1,0) [0|255] "" XXX - SG_ CNT : 8|4@1+ (1,0) [0|15] "" XXX - SG_ NEW_SIGNAL_3 : 44|10@1+ (1,0) [0|7] "" XXX - SG_ NEW_SIGNAL_2 : 54|7@1+ (1,0) [0|3] "" XXX - -BO_ 252 ESC_51: 48 XXX - SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX - SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX - SG_ AEB_Breaking_01 : 24|8@1+ (1,0) [0|255] "" XXX - SG_ AEB_Breaking_02 : 32|8@1+ (1,0) [0|255] "" XXX - SG_ Accelerator_Higher_Speed : 40|1@0+ (1,0) [0|1] "" XXX - SG_ Brake_Pressure : 42|9@1+ (0.195,0) [0|100] "Unit_Percent" XXX - SG_ HL_Radgeschw : 64|16@1+ (0.0075,0) [0|491.5125] "Unit_KilometerPerHour" XXX - SG_ HR_Radgeschw : 80|16@1+ (0.0075,0) [0|491.5125] "Unit_KilometerPerHour" XXX - SG_ VL_Radgeschw : 96|16@1+ (0.0075,0) [0|491.5125] "Unit_KilometerPerHour" XXX - SG_ VR_Radgeschw : 112|16@1+ (0.0075,0) [0|491.5125] "Unit_KilometerPerHour" XXX - SG_ HL_Brake_Pressure : 152|8@1+ (1,0) [0|100] "" XXX - SG_ HR_Brake_Pressure : 160|8@1+ (1,0) [0|100] "" XXX - SG_ VL_Brake_Pressure : 168|8@1+ (1,0) [0|100] "" XXX - SG_ VR_Brake_Pressure : 176|8@1+ (1,0) [0|100] "" XXX - SG_ Steering_Wheel_CW : 184|8@1+ (1.67,0) [0|255] "" XXX - SG_ Steering_Wheel_CCW : 192|8@1+ (1.67,0) [0|255] "" XXX - -BO_ 253 ESP_21: 8 Gateway - SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" Vector__XXX - SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" Vector__XXX - SG_ BR_Eingriffsmoment : 12|10@1+ (1,-509) [-509|509] "" Vector__XXX - SG_ ESP_Diagnose : 23|1@1+ (1,0) [0|1] "" ZR_High - SG_ ESC_v_Signal_Qualifier_High_Low : 24|3@1+ (1,0) [0|7] "" Vector__XXX - SG_ ESP_Vorsteuerung : 28|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ OBD_Schlechtweg : 30|1@1+ (1,0) [0|1] "" ZR_High - SG_ OBD_QBit_Schlechtweg : 31|1@1+ (1,0) [0|1] "" ZR_High - SG_ ESP_v_Signal : 32|16@1+ (0.01,0) [0|655.32] "Unit_KiloMeterPerHour" BedienSG_hi,DDA,OTA_FC,ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard - SG_ ASR_Tastung_passiv : 48|1@1+ (1,0) [0|1] "" OTA_FC - SG_ ESP_Tastung_passiv : 49|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3 - SG_ ESP_Systemstatus : 50|1@1+ (1,0) [0|1] "" OTA_FC - SG_ ASR_Schalteingriff : 51|2@1+ (1,0) [0|3] "" Vector__XXX - SG_ ESP_QBit_v_Signal : 55|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard - SG_ ABS_Bremsung : 56|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3 - SG_ ASR_Anf : 57|1@1+ (1,0) [0|1] "" ZR_High - SG_ MSR_Anf : 58|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High - SG_ EBV_Eingriff : 59|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ EDS_Eingriff : 60|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ ESP_Eingriff : 61|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High - SG_ ESP_ASP : 62|1@1+ (1,0) [0|1] "" ZR_High - SG_ ESC_Neutralschaltung : 63|1@1+ (1,0) [0|1] "" Vector__XXX - -BO_ 258 ESC_50: 48 XXX - SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX - SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX - SG_ Lateral_Accel : 16|8@1+ (0.15,-18.9) [0|255] "Unit_MeterPerSquareSecond" XXX - SG_ Longitudinal_Accel : 24|10@1+ (0.03125,-16) [0|255] "Unit_MeterPerSquareSecond" XXX - SG_ Yaw_Rate : 40|14@1+ (0.01,0) [0|16383] "Unit_DegreePerSecond" XXX - SG_ Yaw_Rate_Sign : 54|1@0+ (1,0) [0|1] "" XXX - SG_ Regen_Braking : 123|1@1+ (1,0) [0|7] "" XXX - SG_ Standstill : 171|1@0+ (1,0) [0|1] "" XXX - SG_ Longitudinal_Speed : 181|10@1+ (0.25,0) [0|255] "Unit_KilometerPerHour" XXX - -BO_ 261 VMM_01: 8 XXX - SG_ CRC : 0|8@1+ (1,0) [0|255] "" XXX - SG_ CNT : 8|4@1+ (1,0) [0|15] "" XXX - SG_ NEW_SIGNAL_5 : 13|1@0+ (1,0) [0|1] "" XXX - SG_ NEW_SIGNAL_4 : 20|1@0+ (1,0) [0|1] "" XXX - SG_ NEW_SIGNAL_3 : 32|1@0+ (1,0) [0|1] "" XXX - SG_ NEW_SIGNAL_1 : 40|2@1+ (1,0) [0|3] "" XXX - SG_ Brake : 53|7@1+ (1,0) [0|3] "" XXX - -BO_ 267 Motor_51: 32 XXX - SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX - SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX - SG_ Accel_Pedal_Pressure : 12|9@1+ (0.4,0) [0|255] "" XXX - SG_ Accel_Low_Pressed_Support : 21|1@1+ (1,0) [0|7] "" XXX - SG_ TSK_Status : 88|3@1+ (1,0) [0|7] "" XXX - SG_ TSK_Limiter_ausgewaehlt : 95|1@1+ (1,0) [0|3] "" XXX - -BO_ 278 ESP_10: 8 Gateway_MQB - SG_ ESP_10_CRC : 0|8@1+ (1,0) [0|255] "" Airbag_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB - SG_ ESP_10_BZ : 8|4@1+ (1,0) [0|15] "" Airbag_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB - SG_ ESP_QBit_Wegimpuls_VL : 12|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB - SG_ ESP_QBit_Wegimpuls_VR : 13|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB - SG_ ESP_QBit_Wegimpuls_HL : 14|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB - SG_ ESP_QBit_Wegimpuls_HR : 15|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB - SG_ ESP_Wegimpuls_VL : 16|10@1+ (1,0) [0|1000] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB - SG_ ESP_Wegimpuls_VR : 26|10@1+ (1,0) [0|1000] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB - SG_ ESP_Wegimpuls_HL : 36|10@1+ (1,0) [0|1000] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB - SG_ ESP_Wegimpuls_HR : 46|10@1+ (1,0) [0|1000] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB - SG_ ESP_VL_Fahrtrichtung : 56|2@1+ (1,0) [0|3] "" Airbag_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB - SG_ ESP_VR_Fahrtrichtung : 58|2@1+ (1,0) [0|3] "" Airbag_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB - SG_ ESP_HL_Fahrtrichtung : 60|2@1+ (1,0) [0|3] "" Airbag_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB - SG_ ESP_HR_Fahrtrichtung : 62|2@1+ (1,0) [0|3] "" Airbag_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB - -BO_ 285 LH_EPS_02: 8 Gateway_D4C7 - SG_ EPS_02_CRC : 0|8@1+ (1,0) [0|255] "" SCU_D4 - SG_ EPS_02_BZ : 8|4@1+ (1,0) [0|15] "" SCU_D4 - SG_ EPS_Notlauf : 12|4@1+ (1,0) [0|15] "" Vector__XXX - SG_ EPS_Lastinfo : 16|8@1+ (1,0) [0|253] "Unit_Amper" Vector__XXX - SG_ EPS_Unterstuetzungsleistung : 24|8@1+ (0.5,0) [0|100] "Unit_PerCent" SCU_D4 - SG_ EPS_Drehzahlreserve : 32|7@1+ (10,0) [0|1000] "Unit_DegreOfArcPerSecon" SCU_D4 - SG_ EPS_VZ_Drehzahlreserve : 39|1@1+ (1,0) [0|1] "" SCU_D4 - SG_ EPS_Leistungsanforderung : 40|1@1+ (1,0) [0|1] "" Vector__XXX - -BO_ 294 HCA_01: 8 Frontsensorik - SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" Vector__XXX - SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" Vector__XXX - SG_ HCA_01_Vib_Freq : 12|4@1+ (1,15) [18|30] "Unit_Hertz" Vector__XXX - SG_ HCA_01_LM_Offset : 16|9@1+ (1,0) [0|511] "Unit_centiNewtoMeter" Vector__XXX - SG_ EA_ACC_Sollstatus : 25|2@1+ (1,0) [0|3] "" Frontradar - SG_ EA_Ruckprofil : 27|3@1+ (1,0) [0|7] "" Vector__XXX - SG_ HCA_01_Enable : 30|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ HCA_01_LM_OffSign : 31|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ HCA_01_Available : 32|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ HCA_01_Standby : 33|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ HCA_01_Request : 34|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ HCA_01_Vib_Amp : 36|4@1+ (0.2,0) [0|3] "Unit_NewtoMeter" Vector__XXX - SG_ EA_Ruckfreigabe : 40|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ EA_ACC_Wunschgeschwindigkeit : 41|10@1+ (0.32,0) [0|327.04] "Unit_KiloMeterPerHour" Frontradar - -BO_ 299 GRA_ACC_01: 8 Gateway - SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" Vector__XXX - SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" Vector__XXX - SG_ GRA_Hauptschalter : 12|1@1+ (1,0) [0|1] "" ZR_High - SG_ GRA_Abbrechen : 13|1@1+ (1,0) [0|1] "" ZR_High - SG_ GRA_Typ_Hauptschalter : 14|1@1+ (1,0) [0|1] "" ZR_High - SG_ GRA_Limiter : 15|1@1+ (1,0) [0|1] "" ZR_High - SG_ GRA_Tip_Setzen : 16|1@1+ (1,0) [0|1] "" ZR_High - SG_ GRA_Tip_Hoch : 17|1@1+ (1,0) [0|1] "" ZR_High - SG_ GRA_Tip_Runter : 18|1@1+ (1,0) [0|1] "" ZR_High - SG_ GRA_Tip_Wiederaufnahme : 19|1@1+ (1,0) [0|1] "" ZR_High - SG_ GRA_Verstellung_Zeitluecke : 20|2@1+ (1,0) [0|3] "" ZR_High - SG_ GRA_Codierung : 22|2@1+ (1,0) [0|3] "" ZR_High - SG_ GRA_Fehler : 24|1@1+ (1,0) [0|1] "" ZR_High - SG_ GRA_LIM_Taste_verfuegbar : 25|1@1+ (1,0) [0|1] "" ZR_High - SG_ GRA_Tip_Stufe_2 : 26|1@1+ (1,0) [0|1] "" ZR_High - SG_ GRA_ButtonTypeInfo : 27|3@1+ (1,0) [0|7] "" ZR_High - SG_ GRA_TravelAssist : 30|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ GRA_reserveByte4 : 31|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ GRA_reserveByte5 : 32|8@1+ (1,0) [0|255] "" Vector__XXX - SG_ GRA_reserveByte6 : 40|8@1+ (1,0) [0|255] "" Vector__XXX - SG_ GRA_reserveByte7 : 48|8@1+ (1,0) [0|255] "" Vector__XXX - SG_ GRA_reserveByte8 : 56|8@1+ (1,0) [0|255] "" Vector__XXX - -BO_ 312 IPA_01: 32 XXX - -BO_ 313 VMM_02: 32 XXX - SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX - SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX - SG_ Brake_Pressed_1 : 16|1@0+ (1,0) [0|1] "" XXX - SG_ Brake_Pressed_2 : 27|1@0+ (1,0) [0|1] "" XXX - SG_ AEB_Active : 31|1@0+ (1,0) [0|1] "" XXX - SG_ ESP_Hold : 35|1@0+ (1,0) [0|1] "" XXX - SG_ Brake_Pressed_3 : 48|1@0+ (1,0) [0|1] "" XXX - SG_ FCW_Active : 56|1@1+ (1,0) [0|1] "" XXX - SG_ Brake_Pressure : 76|11@1+ (1,0) [0|100] "" XXX - -BO_ 317 QFK_01: 32 XXX - SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX - SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX - SG_ NEW_SIGNAL_5 : 12|1@0+ (1,0) [0|1] "" XXX - SG_ NEW_SIGNAL_9 : 14|1@0+ (1,0) [0|1] "" XXX - SG_ NEW_SIGNAL_8 : 16|1@0+ (1,0) [0|1] "" XXX - SG_ LatCon_HCA_Accept : 17|2@1+ (1,0) [0|3] "" XXX - SG_ NEW_SIGNAL_2 : 19|1@0+ (1,0) [0|1] "" XXX - SG_ LatCon_HCA_Status : 20|3@1+ (1,0) [0|15] "" XXX - SG_ NEW_SIGNAL_1 : 23|1@0+ (1,0) [0|1] "" XXX - SG_ NEW_SIGNAL_10 : 24|1@0+ (1,0) [0|1] "" XXX - SG_ NEW_SIGNAL_6 : 30|3@0+ (1,0) [0|1] "" XXX - SG_ NEW_SIGNAL_7 : 34|3@0+ (1,0) [0|1] "" XXX - SG_ Steering_Angle_VZ : 36|1@0+ (1,0) [0|1] "" XXX - SG_ Curvature : 40|15@1+ (6.7e-06,0) [0|65535] "" XXX - SG_ Curvature_VZ : 55|1@0+ (1,0) [0|1] "" XXX - SG_ NEW_SIGNAL_3 : 56|7@1+ (1,0) [0|63] "" XXX - SG_ NEW_SIGNAL_4 : 63|1@0+ (1,0) [0|1] "" XXX - SG_ Steering_Angle : 76|17@1+ (0.00906,0) [0|32767] "" XXX - -BO_ 319 PreCrash_02: 8 Gateway - SG_ PreCrash_02_CRC : 0|8@1+ (1,0) [0|255] "" Vector__XXX - SG_ PreCrash_02_BZ : 8|4@1+ (1,0) [0|15] "" Vector__XXX - SG_ PreCrash_Charisma_FahrPr : 12|4@1+ (1,0) [0|15] "" Vector__XXX - SG_ PreCrash_Charisma_Status : 16|2@1+ (1,0) [0|3] "" Vector__XXX - SG_ PreCrash_Schiebedach_schliessen : 18|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ PreCrash_Fenster_schliessen : 19|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ PreCrash_Blinken : 20|3@1+ (1,0) [0|7] "" Vector__XXX - SG_ SC_PreSense_FCWP : 23|1@1+ (1,0) [0|1] "" NightVision - SG_ PreCrash_Tueren_Verriegeln : 24|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ PreCrash_Anforderung_AFR : 26|3@1+ (1,0) [0|7] "" Vector__XXX - SG_ SC_PreCrash_LED : 29|2@1+ (1,0) [0|3] "" Vector__XXX - SG_ PreCrash_FS_Pneumatik_ansteuern : 31|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ PreCrash_BFS_Pneumatik_ansteuern : 32|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ PreCrash_Fo_Pneumatik_ansteuern : 33|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ PreCrash_FS_Sitzlehne_verfahren : 34|3@1+ (1,0) [0|7] "" Vector__XXX - SG_ PreCrash_BFS_Sitzlehne_verfahren : 37|3@1+ (1,0) [0|7] "" Vector__XXX - SG_ PreCrash_Fo_Sitzlehne_verfahren : 40|3@1+ (1,0) [0|7] "" Vector__XXX - SG_ PreCrash_FS_KSV_verfahren : 43|4@1+ (1,0) [0|15] "" Vector__XXX - SG_ PreCrash_BFS_KSV_verfahren : 47|4@1+ (1,0) [0|15] "" Vector__XXX - SG_ PreCrash_Fo_KSV_verfahren : 51|4@1+ (1,0) [0|15] "" Vector__XXX - SG_ SC_PreCrash_Warnung : 56|4@1+ (1,0) [0|15] "" NightVision - SG_ SC_PreCrash_Texte : 60|4@1+ (1,0) [0|15] "" Vector__XXX - -BO_ 332 Motor_54: 32 XXX - SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX - SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX - SG_ Accelerator_Pressure : 175|8@0+ (0.391,-14.467) [0|100] "Unit_Percent" XXX - -BO_ 333 ACC_18: 32 XXX - SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX - SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX - SG_ ACC_limitierte_Anfahrdyn : 12|1@1+ (1,0) [0|1] "" XXX - SG_ ACC_nachtr_Stopp_Anf : 13|1@1+ (1,0) [0|1] "" XXX - SG_ ACC_DynErhoehung : 14|1@1+ (1,0) [0|1] "" XXX - SG_ ACC_Freilaufstrategie_TSK : 15|1@1+ (1,0) [0|1] "" XXX - SG_ ACC_zul_Regelabw_unten : 16|6@1+ (0.024,0) [0|1.512] "Unit_MeterPerSeconSquar" XXX - SG_ ACC_StartStopp_Info : 22|2@1+ (1,0) [0|3] "" XXX - SG_ ACC_Sollbeschleunigung_02 : 24|11@1+ (0.005,-7.22) [-7.22|3.005] "Unit_MeterPerSeconSquar" XXX - SG_ ACC_zul_Regelabw_oben : 35|5@1+ (0.0625,0) [0|1.9375] "Unit_MeterPerSeconSquar" XXX - SG_ ACC_neg_Sollbeschl_Grad_02 : 40|8@1+ (0.05,0) [0|12.75] "Unit_MeterPerCubicSecon" XXX - SG_ ACC_pos_Sollbeschl_Grad_02 : 48|8@1+ (0.05,0) [0|12.75] "Unit_MeterPerCubicSecon" XXX - SG_ ACC_Anfahren : 56|1@1+ (1,0) [0|1] "" XXX - SG_ ACC_Anhalten : 57|1@1+ (1,0) [0|1] "" XXX - SG_ ACC_Typ : 58|2@1+ (1,0) [0|3] "" XXX - SG_ ACC_Status_ACC : 60|3@1+ (1,0) [0|7] "" XXX - SG_ ACC_Minimale_Bremsung : 63|1@1+ (1,0) [0|1] "" XXX - SG_ ACC_Anhalteweg : 64|11@1+ (0.01,0) [0|2046] "" XXX - SG_ ACC_Anforderung_HMS : 77|3@1+ (1,0) [0|7] "" XXX - SG_ SET_ME_0XFE : 80|8@1+ (1,0) [0|255] "" XXX - SG_ ACC_AKTIV_regelt : 90|1@0+ (1,0) [0|1] "" XXX - SG_ SET_ME_0X1 : 92|1@0+ (1,0) [0|1] "" XXX - SG_ SET_ME_0X9 : 232|4@1+ (1,0) [0|15] "" XXX - SG_ Speed : 236|11@1+ (0.1,0) [0|15] "" XXX - SG_ Accel_Boost : 248|6@1+ (1,0) [0|3] "" XXX - SG_ Reversing : 254|1@0+ (1,0) [0|1] "" XXX - -BO_ 339 MSG_HYB_30: 8 Gateway - SG_ MSG_HYB_30_CRC : 0|8@1+ (1,0) [0|255] "" Ladegeraet_Konzern - SG_ MSG_HYB_30_BZ : 8|4@1+ (1,0) [0|15] "" Ladegeraet_Konzern - SG_ MO_HVEM_Eskalation : 12|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ MO_ErwGrenzen_Anf : 13|1@1+ (1,0) [0|1] "" BMC_MLBevo - SG_ MO_Fehler_Notentladung_Anf : 14|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ MO_HVEM_MaxLeistung : 15|9@1+ (50,0) [0|25450] "Unit_Watt" Vector__XXX - SG_ MO_HVK_EmIstzustand : 24|8@1+ (1,0) [0|255] "" Vector__XXX - SG_ MO_HVK_AntriebFehlerstatus : 37|3@1+ (1,0) [0|7] "" Vector__XXX - SG_ MO_MVK_Bordnetz_Anf : 40|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ MO_HVK_AntriebZustand : 41|3@1+ (1,0) [0|7] "" TME - SG_ MO_HVK_EmFehlerstatus : 44|3@1+ (1,0) [0|7] "" Vector__XXX - SG_ MO_MVK_AntriebFehlerstatus : 47|3@1+ (1,0) [0|7] "" Vector__XXX - SG_ MO_MVK_AntriebZustand : 50|3@1+ (1,0) [0|7] "" Vector__XXX - SG_ MO_MVK_EmFehlerstatus : 53|3@1+ (1,0) [0|7] "" Vector__XXX - SG_ MO_MVK_EmIstzustand : 56|8@1+ (1,0) [0|255] "" Vector__XXX - -BO_ 387 MEB_Camera_01: 64 XXX - SG_ NEW_SIGNAL_1 : 191|1@0+ (1,0) [0|1] "" XXX - SG_ NEW_SIGNAL_2 : 200|9@1+ (1,0) [0|255] "" XXX - SG_ NEW_SIGNAL_3 : 209|9@1+ (1,0) [0|127] "" XXX - SG_ NEW_SIGNAL_9 : 218|6@1+ (1,0) [0|63] "" XXX - SG_ NEW_SIGNAL_10 : 224|8@1+ (1,0) [0|127] "" XXX - SG_ NEW_SIGNAL_4 : 232|9@1+ (1,0) [0|255] "" XXX - SG_ NEW_SIGNAL_5 : 241|9@1+ (1,0) [0|127] "" XXX - SG_ NEW_SIGNAL_8 : 250|6@1+ (1,0) [0|63] "" XXX - SG_ Lane_Center_Offset : 256|12@1+ (0.001,-2.5) [0|255] "Unit_Meter" XXX - SG_ NEW_SIGNAL_6 : 268|12@1+ (1,0) [0|255] "" XXX - SG_ NEW_SIGNAL_7 : 280|12@1+ (1,0) [0|255] "" XXX - SG_ NEW_SIGNAL_11 : 292|12@1+ (1,0) [0|15] "" XXX - SG_ NEW_SIGNAL_12 : 304|8@1+ (1,0) [0|255] "" XXX - SG_ NEW_SIGNAL_13 : 320|8@1+ (1,0) [0|255] "" XXX - SG_ NEW_SIGNAL_14 : 332|12@1+ (1,0) [0|15] "" XXX - SG_ NEW_SIGNAL_15 : 344|12@1+ (1,0) [0|255] "" XXX - SG_ NEW_SIGNAL_16 : 356|12@1+ (1,0) [0|15] "" XXX - SG_ NEW_SIGNAL_17 : 368|10@1+ (1,0) [0|255] "" XXX - SG_ NEW_SIGNAL_18 : 384|12@1+ (1,0) [0|255] "" XXX - SG_ NEW_SIGNAL_19 : 396|12@1+ (1,0) [0|15] "" XXX - SG_ NEW_SIGNAL_20 : 408|12@1+ (1,0) [0|255] "" XXX - SG_ NEW_SIGNAL_21 : 420|12@1+ (1,0) [0|15] "" XXX - SG_ NEW_SIGNAL_22 : 432|5@1+ (1,0) [0|31] "" XXX - SG_ NEW_SIGNAL_23 : 448|12@1+ (1,0) [0|255] "" XXX - SG_ NEW_SIGNAL_24 : 460|12@1+ (1,0) [0|15] "" XXX - SG_ NEW_SIGNAL_25 : 472|12@1+ (1,0) [0|255] "" XXX - SG_ NEW_SIGNAL_26 : 484|12@1+ (1,0) [0|15] "" XXX - -BO_ 420 EA_01: 8 Gateway - SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" Vector__XXX - SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" Vector__XXX - SG_ EA_Parken_beibehalten_HMS : 12|2@1+ (1,0) [0|3] "" Vector__XXX - SG_ EA_Warnruckprofil : 28|3@1+ (1,0) [0|7] "" Vector__XXX - SG_ EA_eCall_Anf : 31|2@1+ (1,0) [0|3] "" ZR_High - SG_ EA_Funktionsstatus : 40|4@1+ (1,0) [0|15] "" ZR_High - SG_ EA_Gurtstraffer_Anf : 44|2@1+ (1,0) [0|3] "" Vector__XXX - SG_ EA_Anforderung_HMS : 48|3@1+ (1,0) [0|7] "" Vector__XXX - SG_ EA_Sollbeschleunigung : 53|11@1+ (0.005,-7.22) [-7.22|3.005] "Unit_MeterPerSeconSquar" Vector__XXX - -BO_ 496 EA_02: 8 Gateway - SG_ EA_02_CRC : 0|8@1+ (1,0) [0|255] "" Vector__XXX - SG_ EA_02_BZ : 8|4@1+ (1,0) [0|15] "" Vector__XXX - SG_ EA_Texte : 12|4@1+ (1,0) [0|15] "" ZR_High - SG_ ACF_Lampe_Hands_Off : 16|2@1+ (1,0) [0|3] "" Vector__XXX - SG_ EA_Infotainment_Anf : 22|2@1+ (1,0) [0|3] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard - SG_ EA_Tueren_Anf : 24|1@1+ (1,0) [0|1] "" ZR_High - SG_ EA_Innenraumlicht_Anf : 25|1@1+ (1,0) [0|1] "" ZR_High - SG_ zFAS_Warnblinken : 26|2@1+ (1,0) [0|3] "" ZR_High - SG_ STP_Primaeranz : 28|3@1+ (1,0) [0|7] "" Vector__XXX - SG_ EA_Bremslichtblinken : 31|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ EA_Blinken : 32|3@1+ (1,0) [0|7] "" Vector__XXX - SG_ EA_Unknown : 60|3@0+ (1,0) [0|7] "" XXX - -BO_ 517 SAM_01: 8 XXX - SG_ Brake_Light : 36|1@0+ (1,0) [0|1] "" XXX - SG_ Left_Blinker : 37|1@0+ (1,0) [0|1] "" XXX - SG_ Right_Blinker : 38|1@0+ (1,0) [0|1] "" XXX - -BO_ 518 Parken_01: 24 XXX - SG_ CHK : 0|8@1+ (1,0) [0|255] "" XXX - SG_ CNT : 8|4@1+ (1,0) [0|15] "" XXX - SG_ AEB_Active : 16|1@0+ (1,0) [0|1] "" XXX - -BO_ 522 EML_06: 64 XXX - SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX - SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX - SG_ Yaw_Rate_VZ : 33|1@1+ (1,0) [0|1] "" XXX - SG_ Yaw_Rate : 200|16@1+ (0.007,-229.34) [0|255] "" XXX - -BO_ 564 MEB_Camera_02: 64 XXX - SG_ NEW_SIGNAL_1 : 12|6@1+ (1,0) [0|15] "" XXX - SG_ NEW_SIGNAL_2 : 18|6@1+ (1,0) [0|63] "" XXX - SG_ NEW_SIGNAL_3 : 24|6@1+ (1,0) [0|63] "" XXX - SG_ NEW_SIGNAL_4 : 30|6@1+ (1,0) [0|3] "" XXX - SG_ NEW_SIGNAL_7 : 178|13@1+ (1,0) [0|127] "" XXX - SG_ NEW_SIGNAL_6 : 192|12@1+ (1,0) [0|255] "" XXX - SG_ NEW_SIGNAL_8 : 286|9@1+ (1,0) [0|3] "" XXX - SG_ NEW_SIGNAL_5 : 295|9@1+ (1,0) [0|255] "" XXX - -BO_ 588 MEB_Side_Assist_01: 16 XXX - SG_ Blind_Spot_Right : 12|7@1+ (1,0) [0|15] "" XXX - SG_ Blind_Spot_Left : 19|7@1+ (1,0) [0|15] "" XXX - SG_ Blind_Spot_Info_Right : 26|1@0+ (1,0) [0|1] "" XXX - SG_ Blind_Spot_Warn_Right : 27|1@0+ (1,0) [0|1] "" XXX - SG_ Blind_Spot_Info_Left : 29|1@0+ (1,0) [0|1] "" XXX - SG_ Blind_Spot_Warn_Left : 30|1@0+ (1,0) [0|1] "" XXX - SG_ Lower_Speed_01 : 32|1@0+ (1,0) [0|1] "" XXX - SG_ Higher_Speed_01 : 33|1@0+ (1,0) [0|1] "" XXX - SG_ Higher_Speed_02 : 83|1@0+ (1,0) [0|1] "" XXX - SG_ Lower_Speed_02 : 84|1@0+ (1,0) [0|1] "" XXX - SG_ Standstill : 86|1@0+ (1,0) [0|1] "" XXX - SG_ NEW_SIGNAL_1 : 98|1@0+ (1,0) [0|1] "" XXX - SG_ NEW_SIGNAL_6 : 119|1@0+ (1,0) [0|1] "" XXX - -BO_ 589 MEB_Side_Assist_02: 64 XXX - SG_ Unknown_01 : 100|3@0+ (1,0) [0|7] "" XXX - SG_ Unknown_02 : 108|3@0+ (1,0) [0|7] "" XXX - -BO_ 591 MEB_Distance_01: 64 XXX - SG_ Unknown_01 : 12|1@0+ (1,0) [0|1] "" XXX - SG_ Distance_Status : 13|2@1+ (1,0) [0|3] "" XXX - SG_ Same_Lane_01_ObjectID : 16|6@1+ (1,0) [0|63] "Unit_ObjectID" XXX - SG_ Left_Lane_01_ObjectID : 22|6@1+ (1,0) [0|63] "Unit_ObjectID" XXX - SG_ Right_Lane_01_ObjectID : 28|6@1+ (1,0) [0|63] "Unit_ObjectID" XXX - SG_ Same_Lane_02_ObjectID : 34|6@1+ (1,0) [0|63] "Unit_ObjectID" XXX - SG_ Left_Lane_02_ObjectID : 40|6@1+ (1,0) [0|63] "Unit_ObjectID" XXX - SG_ Right_Lane_02_ObjectID : 46|6@1+ (1,0) [0|63] "Unit_ObjectID" XXX - SG_ Unknown_02 : 52|2@1+ (1,0) [0|3] "" XXX - SG_ Unknown_03 : 54|10@1+ (1,0) [0|3] "" XXX - SG_ Same_Lane_01_Long_Distance : 64|12@1+ (0.07,-6) [0|300] "Unit_Meter" XXX - SG_ Same_Lane_01_Lat_Distance : 76|10@1+ (0.065,-33.28) [-50|50] "Unit_Meter" XXX - SG_ Same_Lane_01_Rel_Velo : 86|10@1+ (0.25,-128) [-100|100] "Unit_MeterPerSecond" XXX - SG_ Left_Lane_01_Long_Distance : 96|12@1+ (0.07,-6) [0|300] "Unit_Meter" XXX - SG_ Left_Lane_01_Lat_Distance : 108|10@1+ (0.065,-33.28) [-50|50] "Unit_Meter" XXX - SG_ Left_Lane_01_Rel_Velo : 118|10@1+ (0.25,-128) [-100|100] "Unit_MeterPerSecond" XXX - SG_ Right_Lane_01_Long_Distance : 128|12@1+ (0.07,-6) [0|300] "Unit_Meter" XXX - SG_ Right_Lane_01_Lat_Distance : 140|10@1+ (0.065,-33.28) [-50|50] "Unit_Meter" XXX - SG_ Right_Lane_01_Rel_Velo : 150|10@1+ (0.25,-128) [-100|100] "Unit_MeterPerSecond" XXX - SG_ Same_Lane_02_Long_Distance : 160|12@1+ (0.07,-6) [0|300] "Unit_Meter" XXX - SG_ Same_Lane_02_Lat_Distance : 172|10@1+ (0.065,-33.28) [-50|50] "Unit_Meter" XXX - SG_ Same_Lane_02_Rel_Velo : 182|10@1+ (0.25,-128) [-100|100] "Unit_MeterPerSecond" XXX - SG_ Left_Lane_02_Long_Distance : 192|12@1+ (0.07,-6) [0|300] "Unit_Meter" XXX - SG_ Left_Lane_02_Lat_Distance : 204|10@1+ (0.065,-33.28) [-50|50] "Unit_Meter" XXX - SG_ Left_Lane_02_Rel_Velo : 214|10@1+ (0.25,-128) [-100|100] "Unit_MeterPerSecond" XXX - SG_ Right_Lane_02_Long_Distance : 224|12@1+ (0.07,-6) [0|300] "Unit_Meter" XXX - SG_ Right_Lane_02_Lat_Distance : 236|10@1+ (0.065,-33.28) [-50|50] "Unit_Meter" XXX - SG_ Right_Lane_02_Rel_Velo : 246|10@1+ (0.25,-128) [-100|100] "Unit_MeterPerSecond" XXX - SG_ Unknown_04 : 256|8@1+ (1,-128) [0|31] "" XXX - SG_ Unknown_05 : 264|6@1+ (1,-15) [0|31] "" XXX - SG_ Unknown_06 : 270|6@1+ (1,0) [0|127] "" XXX - SG_ Unknown_07 : 277|6@1+ (1,0) [0|7] "" XXX - SG_ Unknown_08 : 284|6@1+ (1,0) [0|1] "" XXX - -BO_ 605 KLR_01: 8 Gateway - SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" Vector__XXX - SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" Vector__XXX - SG_ KLR_Fehler : 12|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ KLR_ResponseError : 13|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ KLR_Lokalaktiv : 14|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ KLR_Fehler_Codierung : 15|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ KLR_Touchintensitaet_1 : 16|8@1+ (1,0) [0|250] "Unit_None" Vector__XXX - SG_ KLR_Touchintensitaet_2 : 24|8@1+ (1,0) [0|250] "Unit_None" Vector__XXX - SG_ KLR_Touchintensitaet_3 : 32|8@1+ (1,0) [0|250] "Unit_None" Vector__XXX - SG_ KLR_Touchauswertung : 40|4@1+ (1,0) [0|15] "" ZR_High - -BO_ 619 TA_01: 8 XXX - SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX - SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX - SG_ Travel_Assist_Status : 13|3@1+ (1,0) [0|3] "" XXX - SG_ Travel_Assist_Request : 19|3@1+ (1,0) [0|7] "" XXX - SG_ Travel_Assist_Available : 23|1@1+ (1,0) [0|1] "" XXX - -BO_ 695 RCTA_01: 8 XXX - SG_ RCTA_01_CRC : 0|8@1+ (1,0) [0|255] "" XXX - SG_ RCTA_01_BZ : 8|4@1+ (1,0) [0|15] "" XXX - -BO_ 706 Motor_41: 8 Gateway - SG_ MO_Anzeige_StSt_Text : 12|4@1+ (1,0) [0|15] "" Vector__XXX - SG_ MO_Anzeige_StSt_Symbol : 16|3@1+ (1,0) [0|7] "" Vector__XXX - SG_ MO_ADR_Status : 19|2@1+ (1,0) [0|3] "" ZR_High - SG_ MO_AGA_Sound_Texte : 21|2@1+ (1,0) [0|3] "" Vector__XXX - SG_ MO_Anzeige_FMAus_Text : 23|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ MO_Fehler_MSpG : 24|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ PEA_Texte : 25|3@1+ (1,0) [0|7] "" Vector__XXX - SG_ TSK_Ueberstimmt_vMax_FahrerInfo : 28|2@1+ (1,0) [0|3] "" Vector__XXX - SG_ MO_Avus_Motorschutz : 30|2@1+ (1,0) [0|3] "" Vector__XXX - SG_ MO_Rekuperationsstufe : 32|3@1+ (1,0) [0|7] "" OTA_FC - SG_ TSK_Einheit_vMax_FahrerInfo : 35|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ TSK_Status_vMax_FahrerInfo : 36|2@1+ (1,0) [0|3] "" Vector__XXX - SG_ MO_Red_Fahrleistung : 38|3@1+ (1,0) [0|7] "" Vector__XXX - SG_ MO_Anz_Kuehlerluefter : 47|3@1+ (1,0) [0|7] "" Vector__XXX - SG_ MO_im_Leerlauf : 50|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ WIV_Enable_Oeldr_Motor : 51|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ MO_OelMessung_Dauer : 52|4@1+ (15,15) [15|225] "Unit_Secon" Vector__XXX - SG_ TSK_vMax_FahrerInfo : 56|8@1+ (1,15) [16|270] "" Vector__XXX - -BO_ 768 MEB_ACC_01: 48 XXX - SG_ ACC_Tempolimit : 64|5@1+ (1,0) [0|31] "" OTA_FC - SG_ ACC_Wunschgeschw_Farbe : 69|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ ACC_Warnung_Verkehrszeichen_1 : 70|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ ACA_Querfuehrung : 71|2@1+ (1,0) [0|3] "" Vector__XXX - SG_ Unknown_02 : 73|1@0+ (1,0) [0|1] "" XXX - SG_ ACC_Regelung_AIO : 75|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3 - SG_ ACC_Wunschgeschw_02 : 76|10@1+ (0.32,0) [0|327.04] "Unit_KiloMeterPerHour" Vector__XXX - SG_ ACC_Abstandsindex_02 : 86|10@1+ (1,0) [1|1021] "" Vector__XXX - SG_ ACC_Display_Prio : 96|2@1+ (1,0) [0|3] "" Vector__XXX - SG_ ACC_rel_Objekt_Zusatzanz : 98|2@1+ (1,0) [0|3] "" Vector__XXX - SG_ ACC_Gesetzte_Zeitluecke : 101|3@1+ (1,0) [0|7] "" Vector__XXX - SG_ ACC_Optischer_Fahrerhinweis : 104|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ ACC_Warnhinweis : 105|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ ACC_EGO_Fahrzeug : 106|3@1+ (1,0) [0|7] "" Vector__XXX - SG_ ACC_Relevantes_Objekt_02 : 109|2@1+ (1,0) [0|3] "" OTA_FC,ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3 - SG_ ACC_Wunschgeschw_erreicht : 112|1@1+ (1,0) [0|1] "" OTA_FC - SG_ ACC_Anzeige_Zeitluecke : 113|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ ACC_Texte_Primaeranz_02 : 114|6@1+ (1,0) [0|63] "" Vector__XXX - SG_ ACC_Texte_Zusatzanz_02 : 120|6@1+ (1,0) [0|63] "" Vector__XXX - SG_ STA_Primaeranz : 126|2@1+ (1,0) [0|3] "" Vector__XXX - SG_ SET_ME_0X3FF : 140|10@1+ (1,0) [0|15] "" XXX - SG_ Heartbeat : 150|9@1+ (1,0) [0|3] "" XXX - SG_ SET_ME_0XFFFF : 160|16@1+ (1,0) [0|65535] "" XXX - SG_ ACC_Enabled : 186|1@0+ (1,0) [0|1] "" XXX - SG_ Zeitluecke_Farbe : 189|1@0+ (1,0) [0|1] "" XXX - SG_ SET_ME_0X1 : 199|1@0+ (1,0) [0|1] "" XXX - SG_ ACC_Status_ACC : 208|3@1+ (1,0) [0|7] "" XXX - SG_ ACC_Akustischer_Fahrerhinweis : 211|2@1+ (1,0) [0|1] "" XXX - SG_ Unknown_08 : 224|1@0+ (1,0) [0|1] "" XXX - SG_ Unknown_01 : 225|1@0+ (1,0) [0|1] "" XXX - SG_ Unknown_06 : 226|1@0+ (1,0) [0|1] "" XXX - SG_ Unknown_07 : 228|1@0+ (1,0) [0|1] "" XXX - SG_ SET_ME_0X7FFF : 240|16@1+ (1,0) [0|65535] "" XXX - SG_ Unknown_09 : 262|1@0+ (1,0) [0|3] "" XXX - SG_ Lead_Type_Detected : 265|1@0+ (1,0) [0|1] "" XXX - SG_ ACC_Standby_Override : 266|1@0+ (1,0) [0|1] "" XXX - SG_ Street_Color : 267|1@0+ (1,0) [0|1] "" XXX - SG_ ACC_Limiter_Mode : 268|1@0+ (1,0) [0|1] "" XXX - SG_ Lead_Brightness : 269|4@1+ (1,0) [0|7] "" XXX - SG_ SET_ME_0X6A : 273|8@1+ (1,0) [0|7] "" XXX - SG_ Lead_Type : 287|3@1+ (1,0) [0|3] "" XXX - SG_ Lead_Distance : 290|10@1+ (0.2,0) [0|7] "Unit_Meter" XXX - SG_ ACC_Events : 332|4@0+ (1,0) [0|3] "Unit_Meter" XXX - SG_ Zeitluecke_1 : 334|9@1+ (0.171,0) [0|100] "Unit_Meter" XXX - SG_ Zeitluecke_2 : 344|9@1+ (0.171,0) [0|100] "Unit_Meter" XXX - SG_ Zeitluecke_3 : 354|9@1+ (0.171,0) [0|100] "Unit_Meter" XXX - SG_ Zeitluecke_4 : 364|9@1+ (0.171,0) [0|100] "Unit_Meter" XXX - SG_ Zeitluecke_5 : 374|9@1+ (0.171,0) [0|100] "Unit_Meter" XXX - -BO_ 771 HCA_03: 24 XXX - SG_ RequestStatus : 12|4@1+ (1,0) [0|15] "" XXX - SG_ Power : 16|8@1+ (0.4,0) [0.0|100.0] "percent" XXX - SG_ Curvature : 24|15@1+ (6.7e-06,0) [0|0.219] "Unit_rad/m" XXX - SG_ Curvature_VZ : 39|1@1+ (1,0) [0|1] "" XXX - SG_ Unknown_01 : 53|1@0+ (1,0) [0|1] "" XXX - SG_ Vibration : 56|1@0+ (1,0) [0|1] "" XXX - SG_ HighSendRate : 66|1@1+ (1,0) [0|1] "" XXX - -BO_ 792 MEB_Camera_03: 8 XXX - -BO_ 795 ESP_24: 8 Gateway - SG_ ESP_Lampe : 12|1@1+ (1,0) [0|1] "" Sub_Gateway - SG_ ABS_Lampe : 13|1@1+ (1,0) [0|1] "" Sub_Gateway - SG_ BK_Lampe_02 : 14|2@1+ (1,0) [0|3] "" Sub_Gateway - SG_ TC_Lampe : 16|1@1+ (1,0) [0|1] "" Sub_Gateway - SG_ ESP_m_Raddrehz : 17|15@1+ (0.002,0) [0|65.278] "Unit_Hertz" Sub_Gateway - SG_ ESP_Textanzeigen_03 : 32|5@1+ (1,0) [0|31] "" Sub_Gateway - SG_ ESP_Meldungen : 37|3@1+ (1,0) [0|7] "" Sub_Gateway - SG_ ESP_Wegimp_VA : 40|11@1+ (1,0) [0|2047] "" Sub_Gateway - SG_ ESP_Fehlerstatus_Wegimp : 51|1@1+ (1,0) [0|1] "" Sub_Gateway - SG_ ESP_Wegimp_Ueberlauf : 52|1@1+ (1,0) [0|1] "" Sub_Gateway - SG_ ESP_QBit_Wegimp_VA : 53|1@1+ (1,0) [0|1] "" Sub_Gateway - SG_ ESP_HDC_Geschw_Farbe : 54|1@1+ (1,0) [0|1] "" Sub_Gateway - SG_ ESP_Off_Lampe : 55|1@1+ (1,0) [0|1] "" Sub_Gateway - SG_ ESP_HDC_Regelgeschw : 56|7@1+ (0.32,0) [0.32|39.68] "Unit_KiloMeterPerHour" Sub_Gateway - SG_ ESP_BKV_Warnung : 63|1@1+ (1,0) [0|1] "" Sub_Gateway - -BO_ 817 MFL_01: 8 Gateway - SG_ MFL_Zaehler : 0|4@1+ (1,0) [0|15] "" Vector__XXX - SG_ MFL_Toggle : 4|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ MFL_Lokalaktiv : 5|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ MFL_M_Taste : 6|1@1+ (1,0) [0|1] "" ZR_High - SG_ MFL_Paddle_Verbau : 7|1@1+ (1,0) [0|1] "" ZR_High - SG_ MFL_Tastencode_1 : 8|8@1+ (1,0) [0|255] "" Vector__XXX - SG_ MFL_Tastencode_2 : 16|8@1+ (1,0) [0|255] "" Vector__XXX - SG_ MFL_Eventcode_1 : 24|4@1+ (1,0) [0|15] "" Vector__XXX - SG_ MFL_Eventcode_2 : 28|4@1+ (1,0) [0|15] "" Vector__XXX - SG_ MFL_Marke : 32|4@1+ (1,0) [0|15] "" Vector__XXX - SG_ MFL_Variante : 36|4@1+ (1,0) [0|15] "" Vector__XXX - SG_ MFL_Dummy_0_Signal_1 : 40|8@1+ (1,0) [0|255] "" Vector__XXX - SG_ MFL_Tip_Down : 48|1@1+ (1,0) [0|1] "" ZR_High - SG_ MFL_Tip_Up : 49|1@1+ (1,0) [0|1] "" ZR_High - SG_ MFL_SatModul_links_Err : 50|1@1+ (1,0) [0|1] "" ZR_High - SG_ MFL_SatModul_rechts_Err : 51|1@1+ (1,0) [0|1] "" ZR_High - SG_ MFL_Dummy_0_Signal_2 : 52|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ MFL_Dummy_0_Signal_3 : 53|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ MFL_LR_HZG_Status : 54|1@1+ (1,0) [0|1] "" ZR_High - SG_ MFL_LR_HZG_Err : 55|1@1+ (1,0) [0|1] "" ZR_High - SG_ MFL_Signalhorn : 56|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High - SG_ MFL_Signalhorn_Err : 57|1@1+ (1,0) [0|1] "" ZR_High - SG_ MFL_Tip_links_Err : 58|1@1+ (1,0) [0|1] "" ZR_High - SG_ MFL_Tip_rechts_Err : 59|1@1+ (1,0) [0|1] "" ZR_High - SG_ MFL_Taste_links_Err : 60|1@1+ (1,0) [0|1] "" ZR_High - SG_ MFL_Taste_rechts_Err : 61|1@1+ (1,0) [0|1] "" ZR_High - SG_ MFL_ECU_Err : 62|1@1+ (1,0) [0|1] "" ZR_High - SG_ MFL_Response_Err : 63|1@1+ (1,0) [0|1] "" Vector__XXX - -BO_ 850 Parken_SM_03: 8 Gateway - SG_ Parken_SM_03_MUX M : 0|3@1+ (1,0) [0|7] "" DDA - SG_ Parken_SM_03_Traj_Trans_ID_00 m0 : 3|4@1+ (1,0) [0|15] "" DDA - SG_ Parken_Traj_P1_Pos_X m0 : 7|13@1+ (0.5,-2047.5) [-2047.5|2048] "Unit_Centimeter" DDA - SG_ Parken_Traj_P1_Pos_Y m0 : 20|13@1+ (0.5,-2047.5) [-2047.5|2048] "Unit_Centimeter" DDA - SG_ Parken_Traj_P1_Tangent m0 : 33|10@1+ (0.3515625,0) [0|359.6484375] "Unit_DegreOfArc" DDA - SG_ Parken_Traj_P2_Pos_X m0 : 43|13@1+ (0.5,-2047.5) [-2047.5|2048] "Unit_Centimeter" DDA - SG_ Parken_SM_03_Traj_Trans_ID_01 m1 : 3|4@1+ (1,0) [0|15] "" DDA - SG_ Parken_Traj_P2_Pos_Y m1 : 7|13@1+ (0.5,-2047.5) [-2047.5|2048] "Unit_Centimeter" DDA - SG_ Parken_Traj_P2_Tangent m1 : 20|10@1+ (0.3515625,0) [0|359.6484375] "Unit_DegreOfArc" DDA - SG_ Parken_Traj_P3_Pos_X m1 : 30|13@1+ (0.5,-2047.5) [-2047.5|2048] "Unit_Centimeter" DDA - SG_ Parken_Traj_P3_Pos_Y m1 : 43|13@1+ (0.5,-2047.5) [-2047.5|2048] "Unit_Centimeter" DDA - SG_ Parken_SM_03_Traj_Trans_ID_02 m2 : 3|4@1+ (1,0) [0|15] "" DDA - SG_ Parken_Traj_P3_Tangent m2 : 7|10@1+ (0.3515625,0) [0|359.6484375] "Unit_DegreOfArc" DDA - SG_ Parken_Traj_P4_Pos_X m2 : 17|13@1+ (0.5,-2047.5) [-2047.5|2048] "Unit_Centimeter" DDA - SG_ Parken_Traj_P4_Pos_Y m2 : 30|13@1+ (0.5,-2047.5) [-2047.5|2048] "Unit_Centimeter" DDA - SG_ Parken_Traj_P4_Tangent m2 : 43|10@1+ (0.3515625,0) [0|359.6484375] "Unit_DegreOfArc" DDA - SG_ Parken_SM_03_Traj_Trans_ID_03 m3 : 3|4@1+ (1,0) [0|15] "" DDA - SG_ Parken_Traj_P5_Pos_X m3 : 7|13@1+ (0.5,-2047.5) [-2047.5|2048] "Unit_Centimeter" DDA - SG_ Parken_Traj_P5_Pos_Y m3 : 20|13@1+ (0.5,-2047.5) [-2047.5|2048] "Unit_Centimeter" DDA - SG_ Parken_Traj_P5_Tangent m3 : 33|10@1+ (0.3515625,0) [0|359.6484375] "Unit_DegreOfArc" DDA - SG_ Parken_Traj_P6_Pos_X m3 : 43|13@1+ (0.5,-2047.5) [-2047.5|2048] "Unit_Centimeter" DDA - SG_ Parken_SM_03_Traj_Trans_ID_04 m4 : 3|4@1+ (1,0) [0|15] "" DDA - SG_ Parken_Traj_P6_Pos_Y m4 : 7|13@1+ (0.5,-2047.5) [-2047.5|2048] "Unit_Centimeter" DDA - SG_ Parken_Traj_P6_Tangent m4 : 20|10@1+ (0.3515625,0) [0|359.6484375] "Unit_DegreOfArc" DDA - SG_ Parken_Traj_P7_Pos_X m4 : 30|13@1+ (0.5,-2047.5) [-2047.5|2048] "Unit_Centimeter" DDA - SG_ Parken_Traj_P7_Pos_Y m4 : 43|13@1+ (0.5,-2047.5) [-2047.5|2048] "Unit_Centimeter" DDA - SG_ Parken_SM_03_Traj_Trans_ID_05 m5 : 3|4@1+ (1,0) [0|15] "" DDA - SG_ Parken_Traj_P7_Tangent m5 : 7|10@1+ (0.3515625,0) [0|359.6484375] "Unit_DegreOfArc" DDA - SG_ Parken_Traj_P8_Pos_X m5 : 17|13@1+ (0.5,-2047.5) [-2047.5|2048] "Unit_Centimeter" DDA - SG_ Parken_Traj_P8_Pos_Y m5 : 30|13@1+ (0.5,-2047.5) [-2047.5|2048] "Unit_Centimeter" DDA - SG_ Parken_Traj_P8_Tangent m5 : 43|10@1+ (0.3515625,0) [0|359.6484375] "Unit_DegreOfArc" DDA - SG_ Parken_SM_03_Traj_Trans_ID_06 m6 : 3|4@1+ (1,0) [0|15] "" DDA - SG_ Parken_Traj_P9_Pos_X m6 : 7|13@1+ (0.5,-2047.5) [-2047.5|2048] "Unit_Centimeter" DDA - SG_ Parken_Traj_P9_Pos_Y m6 : 20|13@1+ (0.5,-2047.5) [-2047.5|2048] "Unit_Centimeter" DDA - SG_ Parken_Traj_P9_Tangent m6 : 33|10@1+ (0.3515625,0) [0|359.6484375] "Unit_DegreOfArc" DDA - -BO_ 869 NVEM_05: 8 Gateway - SG_ NVEM_05_CRC : 0|8@1+ (1,0) [0|255] "" Vector__XXX - SG_ NVEM_05_BZ : 8|4@1+ (1,0) [0|15] "" Vector__XXX - SG_ NVEM_Pilot_Info : 12|2@1+ (1,0) [0|3] "" Vector__XXX - SG_ NVEM_P_Generator_Status : 15|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ BEM_P_Generator : 16|8@1+ (50,0) [0|12700] "Unit_Watt" Vector__XXX - SG_ BEM_n_LLA : 24|2@1+ (1,0) [0|3] "" Vector__XXX - SG_ BEM_Anf_KL : 29|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ BEM_StartStopp_Info : 30|2@1+ (1,0) [0|3] "" Vector__XXX - SG_ BEM_DFM : 32|5@1+ (3.225,0.025) [0.025|100] "" Vector__XXX - SG_ BEM_Batt_Ab : 38|1@1+ (1,0) [0|1] "" DCDC_800V_PAG,DCDC_IHEV - SG_ BEM_Hybrid_Info : 44|2@1+ (1,0) [0|3] "" Vector__XXX - SG_ NVEM_Red_KL : 46|2@1+ (1,0) [0|3] "" TME - SG_ NVEM_Freilauf_Info : 48|2@1+ (1,0) [0|3] "" Vector__XXX - SG_ BEM_HYB_DC_uSollLV : 50|6@1+ (0.1,10.6) [10.6|16] "Unit_Volt" DCDC_800V_PAG,DCDC_HV,LE_MLBevo - SG_ BEM_HYB_DC_uMinLV : 56|8@1+ (0.1,0) [0|25.3] "Unit_Volt" Vector__XXX - -BO_ 870 Blinkmodi_02: 8 Gateway - SG_ BM_ZV_auf : 12|1@1+ (1,0) [0|1] "" ZR_High - SG_ BM_ZV_zu : 13|1@1+ (1,0) [0|1] "" ZR_High - SG_ BM_DWA_ein : 14|1@1+ (1,0) [0|1] "" ZR_High - SG_ BM_DWA_Alarm : 15|1@1+ (1,0) [0|1] "" ZR_High - SG_ BM_Crash : 16|1@1+ (1,0) [0|1] "" ZR_High - SG_ BM_Panik : 17|1@1+ (1,0) [0|1] "" ZR_High - SG_ BM_Not_Bremsung : 18|1@1+ (1,0) [0|1] "" ZR_High - SG_ BM_GDO : 19|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ BM_Warnblinken : 20|1@1+ (1,0) [0|1] "" ZR_High - SG_ BM_Taxi_Notalarm : 21|1@1+ (1,0) [0|1] "" ZR_High - SG_ BM_Telematik : 22|1@1+ (1,0) [0|1] "" ZR_High - SG_ BM_links : 23|1@1+ (1,0) [0|1] "" ZR_High - SG_ BM_rechts : 24|1@1+ (1,0) [0|1] "" ZR_High - SG_ Blinken_li_Fzg_Takt : 25|1@1+ (1,0) [0|1] "" ZR_High - SG_ Blinken_re_Fzg_Takt : 26|1@1+ (1,0) [0|1] "" ZR_High - SG_ Blinken_li_Kombi_Takt : 27|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard - SG_ Blinken_re_Kombi_Takt : 28|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard - SG_ BM_NBA_n_codiert_n_aktiv : 29|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ BM_NBA_Status : 30|2@1+ (1,0) [0|3] "" Vector__XXX - SG_ BM_WBT_Beleuchtung : 32|1@1+ (1,0) [0|1] "" ZR_High - SG_ BM_HD_Oeffnung_angelernt : 33|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ BM_Autobahn : 34|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3 - SG_ BM_Rollenmodus_Blinken : 35|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ BM_Recas : 36|1@1+ (1,0) [0|1] "" ZR_High - SG_ BM_Wischblinken : 37|1@1+ (1,0) [0|1] "" ZR_High - SG_ BM_Telematik_Abbruchgrund : 38|6@1+ (1,0) [0|63] "" Vector__XXX - SG_ BM_PiloPa : 44|1@1+ (1,0) [0|1] "" ZR_High - SG_ DWA_Alarmquelle : 59|5@1+ (1,0) [0|31] "" ZR_High - -BO_ 888 GNSS_04: 8 Gateway - SG_ GNSS_Nachrichtenpaket_ID4 : 0|2@1+ (1,0) [0|3] "Unit_Bit" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard - SG_ GNSS_Ortung_Zeit_in_GPSWoche : 2|30@1+ (1,0) [0|604800001] "Unit_MilliSecon" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard - SG_ GNSS_Ortung_Hoehe : 32|12@1+ (2,-500) [-500|7686] "Unit_Meter" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard - -BO_ 891 GNSS_05: 8 Gateway - SG_ GNSS_UTC_Zeit : 0|32@1+ (1,0) [1|4294967295] "Unit_Secon" OTA_FC,ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard - SG_ GNSS_Empfaenger_Status : 32|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard - SG_ GNSS_GPS_in_Nutzung : 33|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard - SG_ GNSS_GLONASS_in_Nutzung : 34|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard - SG_ GNSS_Empfangbare_Satelliten : 35|5@1+ (1,0) [1|30] "Unit_None" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard - SG_ GNSS_Sichtbare_Satelliten : 40|5@1+ (1,0) [1|30] "Unit_None" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard - SG_ GNSS_Genutzte_Satelliten : 45|5@1+ (1,0) [1|30] "Unit_None" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard - SG_ GNSS_Nachrichtenpaket_ID5 : 50|2@1+ (1,0) [0|3] "Unit_Bit" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard - -BO_ 896 APS_Master: 8 XXX - SG_ Active : 54|1@0+ (1,0) [0|1] "" XXX - SG_ Distance : 55|9@1+ (1,0) [0|255] "" XXX - -BO_ 916 WBA_03: 8 Gateway - SG_ WBA_03_CRC : 0|8@1+ (1,0) [0|255] "" Sub_Gateway - SG_ WBA_03_BZ : 8|4@1+ (1,0) [0|15] "" Sub_Gateway - SG_ WBA_Fahrstufe_02 : 12|4@1+ (1,0) [0|15] "" Sub_Gateway - SG_ WBA_ZielFahrstufe : 16|4@1+ (1,0) [0|15] "" Sub_Gateway - SG_ WBA_GE_Warnung_02 : 20|4@1+ (1,0) [0|15] "" Sub_Gateway - SG_ WBA_eing_Gang_02 : 24|4@1+ (1,0) [0|15] "" Sub_Gateway - SG_ WBA_GE_Texte : 28|3@1+ (1,0) [0|7] "" Sub_Gateway - SG_ WBA_Segeln_aktiv : 31|1@1+ (1,0) [0|1] "" Sub_Gateway - SG_ WBA_Schaltschema : 32|5@1+ (1,0) [0|31] "" Sub_Gateway - SG_ WBA_GE_Zusatzwarnungen : 37|3@1+ (1,0) [0|7] "" Sub_Gateway - SG_ GE_Sollgang : 40|4@1+ (1,0) [0|15] "" Sub_Gateway - SG_ GE_Tipschaltempf_verfuegbar : 44|1@1+ (1,0) [0|1] "" Sub_Gateway - SG_ WBA_GE_Texte_02 : 45|3@1+ (1,0) [0|7] "" Sub_Gateway - SG_ WBA_GE_Texte_03 : 48|4@1+ (1,0) [0|15] "" Sub_Gateway - SG_ WBA_Blinken : 54|1@1+ (1,0) [0|1] "" Sub_Gateway - SG_ GE_Wiederstart_Anz_Std : 55|1@1+ (1,0) [0|1] "" Sub_Gateway - SG_ GE_Stoppverbot_Anz_01 : 56|1@1+ (1,0) [0|1] "" Sub_Gateway - SG_ GE_Stoppverbot_Anz_02 : 57|1@1+ (1,0) [0|1] "" Sub_Gateway - SG_ GE_Stoppverbot_Anz_03 : 58|1@1+ (1,0) [0|1] "" Sub_Gateway - SG_ GE_Stoppverbot_Anz_04 : 59|1@1+ (1,0) [0|1] "" Sub_Gateway - SG_ GE_Stoppverbot_Anz_05 : 60|1@1+ (1,0) [0|1] "" Sub_Gateway - SG_ GE_Stoppverbot_Anz_06 : 61|1@1+ (1,0) [0|1] "" Sub_Gateway - SG_ GE_Stoppverbot_Anz_07 : 62|1@1+ (1,0) [0|1] "" Sub_Gateway - SG_ GE_Stoppverbot_Anz_Std : 63|1@1+ (1,0) [0|1] "" Sub_Gateway - -BO_ 919 LDW_02: 8 XXX - SG_ LDW_Gong : 12|2@1+ (1,0) [0|3] "" XXX - SG_ LDW_SW_Warnung_links : 14|1@1+ (1,0) [0|1] "" XXX - SG_ LDW_SW_Warnung_rechts : 15|1@1+ (1,0) [0|1] "" XXX - SG_ LDW_Texte : 16|4@1+ (1,0) [0|15] "" XXX - SG_ LDW_Seite_DLCTLC : 20|1@1+ (1,0) [0|1] "" XXX - SG_ LDW_Lernmodus : 21|3@1+ (1,0) [0|7] "" XXX - SG_ LDW_Anlaufsp_VLR : 24|4@1+ (1,0) [0|15] "" XXX - SG_ LDW_Vib_Amp_VLR : 28|4@1+ (1,0) [0|15] "" XXX - SG_ LDW_Anlaufzeit_VLR : 32|4@1+ (1,0) [0|15] "" XXX - SG_ LDW_Lernmodus_rechts : 36|2@1+ (1,0) [0|3] "" XXX - SG_ LDW_Lernmodus_links : 38|2@1+ (1,0) [0|3] "" XXX - SG_ LDW_DLC : 40|8@1+ (0.01,-1.25) [-1.25|1.25] "Unit_Meter" XXX - SG_ LDW_TLC : 48|5@1+ (0.1,0) [0|3] "Unit_Secon" XXX - SG_ LDW_Warnung_links : 56|1@1+ (1,0) [0|1] "" XXX - SG_ LDW_Warnung_rechts : 57|1@1+ (1,0) [0|1] "" XXX - SG_ LDW_Codierinfo_fuer_VLR : 58|2@1+ (1,0) [0|3] "" XXX - SG_ LDW_Frontscheibenheizung_aktiv : 60|1@1+ (1,0) [0|1] "" XXX - SG_ LDW_Status_LED_gelb : 61|1@1+ (1,0) [0|1] "" XXX - SG_ LDW_Status_LED_gruen : 62|1@1+ (1,0) [0|1] "" XXX - SG_ LDW_KD_Fehler : 63|1@1+ (1,0) [0|1] "" XXX - -BO_ 949 Klima_11: 8 Gateway - SG_ KL_Drehz_Anh : 0|1@1+ (1,0) [0|1] "" TME - SG_ KL_Vorwarn_Komp_ein : 1|1@1+ (1,0) [0|1] "" TME - SG_ KL_AC_Schalter : 2|1@1+ (1,0) [0|1] "" TME - SG_ KL_Komp_Moment_alt : 3|1@1+ (1,0) [0|1] "" TME - SG_ KL_Vorwarn_Zuheizer_ein : 6|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ KL_Zustand : 7|1@1+ (1,0) [0|1] "" TME - SG_ KL_Kompressorkupplung_linear : 8|8@1+ (20,0) [0|4000] "Unit_MilliAmper" Vector__XXX - SG_ KL_Charisma_FahrPr : 16|4@1+ (1,0) [0|15] "" TME - SG_ KL_Charisma_Status : 20|2@1+ (1,0) [0|3] "" TME - SG_ KL_nachtr_Stopp_Anf : 22|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ KL_T_Charge : 23|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ KL_Last_Kompr : 24|8@1+ (0.25,0) [0|63.5] "Unit_NewtoMeter" TME - SG_ KL_Spannungs_Anf : 32|2@1+ (1,0) [0|3] "" Vector__XXX - SG_ KL_Thermomanagement : 34|2@1+ (1,0) [0|3] "" TME - SG_ KL_StartStopp_Info : 36|2@1+ (1,0) [0|3] "" TME - SG_ KL_Freilauf_Info : 38|2@1+ (1,0) [0|3] "" Vector__XXX - SG_ KL_Anf_KL : 40|8@1+ (0.4,0) [0|101.6] "Unit_PerCent" TME - SG_ KL_el_Zuheizer_Stufe : 48|3@1+ (1,0) [0|7] "" TME - SG_ KL_Ausstattung_Klima : 51|3@1+ (1,0) [0|7] "" Vector__XXX - SG_ KL_Variante_Standheizung : 54|2@1+ (1,0) [0|3] "" Vector__XXX - -BO_ 958 Motor_14: 8 Gateway - SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX - SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX - SG_ MO_StartStopp_Status : 12|2@1+ (1,0) [0|3] "" Sub_Gateway,TME - SG_ MO_StartStopp_Wiederstart : 14|1@1+ (1,0) [0|1] "" BMS_NV,Sub_Gateway,TME - SG_ MO_StartStopp_Motorstopp : 15|1@1+ (1,0) [0|1] "" BMS_NV,Sub_Gateway,TME - SG_ MO_Freig_Reku : 16|2@1+ (1,0) [0|3] "" Sub_Gateway - SG_ MO_Kl_75 : 18|1@1+ (1,0) [0|1] "" Sub_Gateway,TME - SG_ MO_Kl_50 : 19|1@1+ (1,0) [0|1] "" DCDC_IHEV,Ladegeraet_Konzern,Sub_Gateway - SG_ MO_Gangposition : 20|4@1+ (1,0) [0|15] "" AWC,Sub_Gateway,TME - SG_ MO_StartStopp_Fahrerwunsch : 24|2@1+ (1,0) [0|3] "" Sub_Gateway,TME - SG_ MO_HYB_Fahrbereitschaft : 26|1@1+ (1,0) [0|1] "" AWC,BMS_NV,Ladegeraet_Konzern,Sub_Gateway,TME - SG_ MO_Ext_E_Fahrt_aktiv : 27|1@1+ (1,0) [0|1] "" Sub_Gateway,TME - SG_ MO_Fahrer_bremst : 28|1@1+ (1,0) [0|1] "" Sub_Gateway - SG_ MO_QBit_Fahrer_bremst : 29|1@1+ (1,0) [0|1] "" Sub_Gateway - SG_ MO_BLS : 30|1@1+ (1,0) [0|1] "" Sub_Gateway - SG_ MO_Konsistenz_Bremsped : 31|1@1+ (1,0) [0|1] "" Sub_Gateway - SG_ MO_KomFehler_ESP : 32|1@1+ (1,0) [0|1] "" Sub_Gateway - SG_ MO_Klima_Eingr : 33|2@1+ (1,0) [0|3] "" Sub_Gateway,TME - SG_ MO_Aussp_Anlass : 35|1@1+ (1,0) [0|1] "" Sub_Gateway - SG_ MO_Freig_Anlass : 36|1@1+ (1,0) [0|1] "" Sub_Gateway - SG_ MO_Kuppl_schalter : 37|1@1+ (1,0) [0|1] "" Sub_Gateway - SG_ MO_Interlock : 38|1@1+ (1,0) [0|1] "" Sub_Gateway - SG_ MO_Motor_laeuft : 39|1@1+ (1,0) [0|1] "" Sub_Gateway,TME - SG_ MO_Kickdown : 40|1@1+ (1,0) [0|1] "" Sub_Gateway,TME - SG_ MO_QBit_KL_75 : 41|1@1+ (1,0) [0|1] "" Sub_Gateway - SG_ MO_EKlKomLeiRed : 42|2@1+ (1,0) [0|3] "" Sub_Gateway - SG_ MO_Handshake_STH : 44|1@1+ (1,0) [0|1] "" Sub_Gateway - SG_ MO_BKV_Unterdruckwarnung : 45|1@1+ (1,0) [0|1] "" Sub_Gateway - SG_ MO_Freigabe_Segeln : 46|1@1+ (1,0) [0|1] "" Sub_Gateway - SG_ MO_PTC_Status : 47|3@1+ (1,0) [0|7] "" Sub_Gateway - SG_ MO_QBit_Gangposition : 50|1@1+ (1,0) [0|1] "" Sub_Gateway - SG_ MO_Signalquelle_Gangposition : 51|1@1+ (1,0) [0|1] "" Sub_Gateway - SG_ MO_Remotestart_Betrieb : 52|1@1+ (1,0) [0|1] "" Sub_Gateway - SG_ MO_Remotestart_moeglich : 53|1@1+ (1,0) [0|1] "" Sub_Gateway - SG_ MO_FMAus_aktiv : 55|1@1+ (1,0) [0|1] "" BMS_NV,Sub_Gateway - SG_ MO_FMAus_Startvariante : 56|2@1+ (1,0) [0|3] "" Sub_Gateway - SG_ MO_BMS_NV_Anf_stuetzen : 58|1@1+ (1,0) [0|1] "" Sub_Gateway - SG_ MO_Zylinderabschaltung : 59|2@1+ (1,0) [0|3] "" Sub_Gateway - SG_ MO_HYB_VM_aktiv : 61|1@1+ (1,0) [0|1] "" Sub_Gateway - SG_ MO_StartVorauss_erfuellt : 62|2@1+ (1,0) [0|3] "" AWC,Ladegeraet_Konzern,Sub_Gateway - -BO_ 960 Klemmen_Status_01: 4 Gateway - SG_ Klemmen_Status_01_CRC : 0|8@1+ (1,0) [0|255] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard - SG_ Klemmen_Status_01_BZ : 8|4@1+ (1,0) [0|15] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard - SG_ RSt_Fahrerhinweise : 12|4@1+ (1,0) [0|15] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard - SG_ ZAS_Kl_S : 16|1@1+ (1,0) [0|1] "" BedienDisp_vo,BedienSG_hi,GurtMikrofon,OTA_FC,ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard - SG_ ZAS_Kl_15 : 17|1@1+ (1,0) [0|1] "" BedienDisp_vo,BedienSG_hi,DDA,GurtMikrofon,OTA_FC,ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard - SG_ ZAS_Kl_X : 18|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard - SG_ ZAS_Kl_50_Startanforderung : 19|1@1+ (1,0) [0|1] "" BedienDisp_vo,BedienSG_hi,OTA_FC,ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard - SG_ BCM_Remotestart_Betrieb : 20|1@1+ (1,0) [0|1] "" BedienSG_hi,ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard - SG_ ZAS_Kl_Infotainment : 21|1@1+ (1,0) [0|1] "" BedienDisp_vo,BedienSG_hi,ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard - SG_ BCM_Remotestart_KL15_Anf : 22|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard - SG_ BCM_Remotestart_MO_Start : 23|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard - SG_ KST_Warn_P1_ZST_def : 24|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard - SG_ KST_Warn_P2_ZST_def : 25|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard - SG_ KST_Fahrerhinweis_1 : 26|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard - SG_ KST_Fahrerhinweis_2 : 27|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard - SG_ BCM_Ausparken_Betrieb : 28|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard - SG_ KST_Fahrerhinweis_4 : 29|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard - SG_ KST_Fahrerhinweis_5 : 30|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard - SG_ KST_Fahrerhinweis_6 : 31|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard - -BO_ 967 Motor_26: 8 Gateway - SG_ MO_Kuehlerluefter_MUX M : 0|1@1+ (1,0) [0|1] "" TME - SG_ MO_Kuehlerluefter_1 m0 : 1|7@1+ (1,0) [0|100] "Unit_PerCent" TME - SG_ MO_Kuehlerluefter_2 m1 : 1|7@1+ (1,0) [0|100] "Unit_PerCent" TME - SG_ MO_EFLEX_Lampe : 8|2@1+ (1,0) [0|3] "" Vector__XXX - SG_ MO_KJS_nicht_bereit : 10|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ MO_ITM_Warnung_Pumpe : 11|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ WIV_Anzeige_aktiv : 12|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ WIV_Oelmin_Warn : 13|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ WIV_Sensorfehler : 14|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ WIV_Schieflage : 15|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ WIV_Oelstand : 16|4@1+ (12.5,0) [0|100] "Unit_PerCent" Vector__XXX - SG_ MO_Zustand_HWP : 20|2@1+ (1,0) [0|3] "" TME - SG_ OLEV_Systemstoerung : 22|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ MO_Oelwarnung_max : 23|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ WIV_Oelsystem_aktiv : 24|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ WIV_nicht_betriebswarm : 25|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ WIV_Ueberfuell_Warn : 26|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ WIV_laufender_Motor : 27|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ MO_E_Warnungen : 28|4@1+ (1,0) [0|15] "" Vector__XXX - SG_ MO_Text_Motorstart : 32|4@1+ (1,0) [0|15] "" Vector__XXX - SG_ MO_E_Texte : 36|4@1+ (1,0) [0|15] "" Vector__XXX - SG_ WIV_Oeldyn_avl : 40|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ MO_Text_Partikelfil_Reg : 41|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ OLEV_Oelstand_nicht_vorhanden : 42|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ WIV_Oelmenge : 43|5@1+ (125,0) [0|3875] "Unit_MilliLiter" Vector__XXX - SG_ MO_Systemlampe : 48|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ MO_OBD2_Lampe : 49|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ MO_Heissleuchte : 50|1@1+ (1,0) [0|1] "" TME - SG_ MO_Partikel_Lampe : 51|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ MO_RedFahrleistung_Lampe : 52|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ WIV_Oelstand_nicht_vorhanden : 53|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ WIV_nachfuellanzeige_ein : 54|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ WIV_Ueberfuell_deaktiv : 55|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ WIV_Unterfuell_Warn : 56|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ MO_Tankdeckel_Lampe : 57|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ MO_Text_Tankdeckelwarn : 58|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ MO_Vorglueh_Lampe : 59|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ WIV_Oeldr_Warn_Motor : 60|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ MO_E_Mode : 61|3@1+ (1,0) [0|7] "" Vector__XXX - -BO_ 974 TSG_HFS_01: 8 Gateway - SG_ HFS_Tuer_geoeffnet : 0|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ HFS_verriegelt : 1|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ HFS_gesafet : 2|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ HFS_Heckrollotaster_betaetigt : 3|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ HFS_Tuerschloss_defekt : 4|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ HFS_Unlock_Taster : 5|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ HFS_Lock_Taster : 6|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ HFS_Sperrklinke : 7|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ HFS_TAG_betaetigt : 8|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ HFS_TIG_betaetigt : 9|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ HFS_FH_S_HBFS_AutoHoch : 10|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ HFS_FH_S_HBFS_AutoTief : 11|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ HFS_FH_S_HBFS_ManHoch : 12|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ HFS_FH_S_HBFS_ManTief : 13|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ HFS_Tuer_Status : 14|2@1+ (1,0) [0|3] "" Vector__XXX - SG_ HFS_SAD_Schalter : 16|4@1+ (1,0) [0|15] "" Vector__XXX - SG_ HFS_FH_S_ManHoch : 20|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ HFS_FH_S_AutoHoch : 21|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ HFS_FH_S_ManTief : 22|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ HFS_FH_S_AutoTief : 23|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ HFS_FH_Oeffnung : 24|8@1+ (0.5,0) [0|100] "Unit_PerCent" Vector__XXX - SG_ HFS_FH_Bew_hoch : 32|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ HFS_FH_Bew_tief : 33|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ HFS_FH_Fang : 34|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ HFS_FH_Block : 35|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ HFS_FH_Thermo : 36|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ HFS_UEKB_aktiviert : 37|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ HFS_Tueroeffnen_Warnung : 38|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ HFS_FH_normiert : 39|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ ASW_Warnung_aktiv_HFS : 40|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ HFS_Zuziehhilfe_aktiv : 41|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ HFS_Seitenrollo_hoch : 42|1@1+ (1,0) [0|1] "" TME - SG_ HFS_Seitenrollo_tief : 43|1@1+ (1,0) [0|1] "" TME - SG_ HFS_Status_KiSi : 44|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ SSR_HFS_Pos_Unten : 45|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ HFS_Oben_Block_erw : 46|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ HFS_Unten_Block_erw : 47|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ MTHFS_M_Taste : 48|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ MTHFS_Pos1 : 49|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ MTHFS_Pos2 : 50|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ MTHFS_Pos3 : 51|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ HFS_MRollo_Schalter : 52|3@1+ (1,0) [0|7] "" Vector__XXX - SG_ HFS_Lock_Taster_inv : 55|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ HFS_Status_eTAG : 56|2@1+ (1,0) [0|3] "" Vector__XXX - SG_ HFS_Tuer_Status_QBit : 58|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ HFS_TCR_Mode_aktiv : 59|1@1+ (1,0) [0|1] "" Vector__XXX - -BO_ 975 TSG_HBFS_01: 8 Gateway - SG_ HBFS_Tuer_geoeffnet : 0|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ HBFS_verriegelt : 1|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ HBFS_gesafet : 2|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ HBFS_Heckrollotaster_betaetigt : 3|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ HBFS_Tuerschloss_defekt : 4|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ HBFS_Unlock_Taster : 5|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ HBFS_Lock_Taster : 6|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ HBFS_Sperrklinke : 7|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ HBFS_TAG_betaetigt : 8|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ HBFS_TIG_betaetigt : 9|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ HBFS_FH_S_HFS_AutoHoch : 10|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ HBFS_FH_S_HFS_AutoTief : 11|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ HBFS_FH_S_HFS_ManHoch : 12|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ HBFS_FH_S_HFS_ManTief : 13|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ HBFS_Tuer_Status : 14|2@1+ (1,0) [0|3] "" Vector__XXX - SG_ HBFS_SAD_Schalter : 16|4@1+ (1,0) [0|15] "" Vector__XXX - SG_ HBFS_FH_S_ManHoch : 20|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ HBFS_FH_S_AutoHoch : 21|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ HBFS_FH_S_ManTief : 22|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ HBFS_FH_S_AutoTief : 23|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ HBFS_FH_Oeffnung : 24|8@1+ (0.5,0) [0|100] "Unit_PerCent" Vector__XXX - SG_ HBFS_FH_Bew_hoch : 32|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ HBFS_FH_Bew_tief : 33|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ HBFS_FH_Fang : 34|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ HBFS_FH_Block : 35|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ HBFS_FH_Thermo : 36|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ HBFS_UEKB_aktiviert : 37|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ HBFS_Tueroeffnen_Warnung : 38|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ HBFS_FH_normiert : 39|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ ASW_Warnung_aktiv_HBFS : 40|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ HBFS_Zuziehhilfe_aktiv : 41|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ HBFS_Seitenrollo_hoch : 42|1@1+ (1,0) [0|1] "" TME - SG_ HBFS_Seitenrollo_tief : 43|1@1+ (1,0) [0|1] "" TME - SG_ HBFS_Status_KiSi : 44|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ SSR_HBFS_Pos_Unten : 45|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ HBFS_Oben_Block_erw : 46|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ HBFS_Unten_Block_erw : 47|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ MTHBFS_M_Taste : 48|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ MTHBFS_Pos1 : 49|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ MTHBFS_Pos2 : 50|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ MTHBFS_Pos3 : 51|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ HBFS_MRollo_Schalter : 52|3@1+ (1,0) [0|7] "" Vector__XXX - SG_ HBFS_Lock_Taster_inv : 55|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ HBFS_Status_KiSi_inv : 56|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ HBFS_Status_eTAG : 57|2@1+ (1,0) [0|3] "" Vector__XXX - SG_ HBFS_Tuer_Status_QBit : 59|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ HBFS_TIG_betaetigt_schliessen : 60|1@1+ (1,0) [0|1] "" Vector__XXX - -BO_ 976 TSG_FT_01: 8 Gateway - SG_ FT_Tuer_geoeffnet : 0|1@1+ (1,0) [0|1] "" Ladegeraet_Konzern,TME - SG_ FT_verriegelt : 1|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ FT_gesafet : 2|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ FT_Schluesselschalter_auf : 3|1@1+ (1,0) [0|1] "" FCU_MLBevo_FCEV - SG_ FT_Schluesselschalter_zu : 4|1@1+ (1,0) [0|1] "" FCU_MLBevo_FCEV - SG_ FT_Unlock_Taster : 5|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ FT_Lock_Taster : 6|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ FT_Sperrklinke : 7|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ FT_TAG_betaetigt : 8|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ FT_TIG_betaetigt : 9|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ FT_IRUE_Taste : 10|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ FT_HD_Taste : 11|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ FT_TD_Taste_Fehler : 12|1@1+ (1,0) [0|1] "" Ladegeraet_Konzern - SG_ FT_TD_Taste : 13|1@1+ (1,0) [0|1] "" FCU_MLBevo_FCEV,Ladegeraet_Konzern - SG_ SSR_Temp_Freigabe : 14|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ FT_Sp_Heizung_Anf : 15|1@1+ (100,0) [0|100] "Unit_PerCent" Vector__XXX - SG_ FT_HD_Taste_2 : 16|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ FT_TSG_hinten_verbaut : 18|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ FT_Sp_Blk_def : 19|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ FT_FH_S_ManHoch : 20|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ FT_FH_S_AutoHoch : 21|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ FT_FH_S_ManTief : 22|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ FT_FH_S_AutoTief : 23|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ FT_FH_Oeffnung : 24|8@1+ (0.5,0) [0|100] "Unit_PerCent" TME - SG_ FT_FH_Bew_hoch : 32|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ FT_FH_Bew_tief : 33|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ FT_FH_Fang : 34|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ FT_FH_Block : 35|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ FT_FH_Thermo : 36|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ FT_UEKB_aktiviert : 37|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ ASW_HMI_defekt : 38|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ FT_FH_normiert : 39|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ FT_Schliesstaster : 40|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ FT_Zuziehhilfe_aktiv : 41|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ FT_SP_ausgerastet : 42|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ FT_SP_lr_aktiv : 43|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ FT_SP_ht_aktiv : 44|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ ASW_wakeup : 45|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ FT_Oben_Block_erw : 46|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ FT_Unten_Block_erw : 47|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ FT_Kisi_li_aktiv : 48|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ FT_Kisi_re_aktiv : 49|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ FT_Kisi_Taster_li : 50|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ FT_Kisi_Taster_re : 51|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ FT_BFS_Fond_Freigabe : 52|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ FT_Kisi_Fehler : 53|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ FT_Daemmglas : 54|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ FT_SP_Heizung_Status : 55|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ ASW_Warnung_aktiv_FS : 56|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ FT_FH_Pos_oben : 57|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ FT_Tuerschloss_defekt : 58|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ FT_SWA_Taster : 59|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ SWA_HMI_Diagnose : 60|2@1+ (1,0) [0|3] "" Vector__XXX - SG_ FS_Status_eTAG : 62|2@1+ (1,0) [0|3] "" Vector__XXX - -BO_ 980 SMLS_01: 8 Gateway - SG_ SMLS_01_CRC : 0|8@1+ (1,0) [0|255] "" Vector__XXX - SG_ SMLS_01_BZ : 8|4@1+ (1,0) [0|15] "" Vector__XXX - SG_ BH_Blinker_li : 12|1@1+ (1,0) [0|1] "" ZR_High,ZR_Standard - SG_ BH_Blinker_re : 13|1@1+ (1,0) [0|1] "" ZR_High,ZR_Standard - SG_ BH_Lichthupe : 14|1@1+ (1,0) [0|1] "" ZR_High - SG_ BH_Fernlicht : 15|1@1+ (1,0) [0|1] "" ZR_High - SG_ WH_Tipwischen : 16|1@1+ (1,0) [0|1] "" ZR_High - SG_ WH_Intervall : 17|1@1+ (1,0) [0|1] "" ZR_High - SG_ WH_WischerStufe1 : 18|1@1+ (1,0) [0|1] "" ZR_High - SG_ WH_WischerStufe2 : 19|1@1+ (1,0) [0|1] "" ZR_High - SG_ WH_Frontwaschen : 20|1@1+ (1,0) [0|1] "" ZR_High - SG_ WH_Heckintervall : 21|1@1+ (1,0) [0|1] "" ZR_High - SG_ WH_Heckwaschen : 22|1@1+ (1,0) [0|1] "" ZR_High - SG_ WH_Intervallstufen : 23|4@1+ (1,0) [0|15] "" ZR_High - SG_ FAS_Taster : 27|1@1+ (1,0) [0|1] "" ZR_High,ZR_Standard - SG_ FAS_Taster_Fehler : 28|1@1+ (1,0) [0|1] "" ZR_High - SG_ SMLS_Hupe : 29|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ LRH_On_Off : 30|2@1+ (1,0) [0|3] "" ZR_High - SG_ LRH_aktiv : 40|1@1+ (1,0) [0|1] "" ZR_High - SG_ SMLS_P_verriegelt_plausibel : 43|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ WH_SRA : 44|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High - SG_ WH_Wischer_Fehler : 45|1@1+ (1,0) [0|1] "" ZR_High - SG_ BH_Blinker_Fehler : 46|1@1+ (1,0) [0|1] "" ZR_High - SG_ SMLS_PTT : 47|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard - SG_ WH_Tipwischen_lang : 48|1@1+ (1,0) [0|1] "" ZR_High - -BO_ 981 Licht_Anf_01: 8 Gateway - SG_ Licht_Anf_01_CRC : 0|8@1+ (1,0) [0|255] "" Vector__XXX - SG_ Licht_Anf_01_BZ : 8|4@1+ (1,0) [0|15] "" Vector__XXX - SG_ BCM1_Kurvenlicht_links_Anf : 12|1@1+ (1,0) [0|1] "" ZR_High - SG_ BCM1_Kurvenlicht_rechts_Anf : 13|1@1+ (1,0) [0|1] "" ZR_High - SG_ BCM1_Standlicht_Anf : 14|1@1+ (1,0) [0|1] "" ZR_High - SG_ BCM1_Abblendlicht_Anf : 15|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High - SG_ BCM1_Fernlicht_Anf : 16|1@1+ (1,0) [0|1] "" ZR_High - SG_ BCM1_Nebellicht_Anf : 17|1@1+ (1,0) [0|1] "" ZR_High - SG_ BCM1_Parklicht_li_Anf : 18|1@1+ (1,0) [0|1] "" ZR_High - SG_ BCM1_Parklicht_re_Anf : 19|1@1+ (1,0) [0|1] "" ZR_High - SG_ BCM1_Nebelschluss_Ahg_Anf : 20|1@1+ (1,0) [0|1] "" ZR_High - SG_ BCM1_Nebelschluss_Fzg_Anf : 21|1@1+ (1,0) [0|1] "" ZR_High - SG_ BCM1_Schlusslicht_Anf : 22|1@1+ (1,0) [0|1] "" ZR_High - SG_ BCM_Rueckfahrlicht_Anf : 23|1@1+ (1,0) [0|1] "" ZR_High,ZR_MIB_TOP_ab_Gen3,ZR_Standard - SG_ BCM1_Signaturlicht_Anf : 24|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ BCM1_Umfeldleuchten_Anf : 25|1@1+ (1,0) [0|1] "" ZR_High - SG_ BCM1_Tagfahrlicht_Anf : 26|1@1+ (1,0) [0|1] "" ZR_High - SG_ BCM1_Regenlicht_Anf : 27|1@1+ (1,0) [0|1] "" ZR_High - SG_ BCM1_Autobahnlicht_Anf : 28|1@1+ (1,0) [0|1] "" ZR_High - SG_ BCM1_Touristen_Licht_Anf : 29|1@1+ (1,0) [0|1] "" ZR_High - SG_ BCM1_CH_aktiv : 30|1@1+ (1,0) [0|1] "" ZR_High - SG_ BCM1_LH_aktiv : 31|1@1+ (1,0) [0|1] "" ZR_High - SG_ BCM1_Gleitende_Leuchtw_Anf : 32|1@1+ (1,0) [0|1] "" ZR_High - SG_ BCM1_GLW_Fernlicht_Anf : 33|1@1+ (1,0) [0|1] "" ZR_High - SG_ BCM1_Adaptive_Lichtvert_Anf : 34|1@1+ (1,0) [0|1] "" ZR_High - SG_ BCM1_FoD_Sperrung_WiBli : 35|2@1+ (1,0) [0|3] "" Vector__XXX - SG_ BCM1_FOD_Sperrung_Animationen_HL : 37|2@1+ (1,0) [0|3] "" Vector__XXX - SG_ BCM1_Animationssperrung : 39|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ BCM1_CH_LH_aktiv : 40|1@1+ (1,0) [0|1] "" ZR_High - SG_ BCM1_Allwetterlicht_Anf : 41|1@1+ (1,0) [0|1] "" ZR_High - SG_ BCM1_Schlusslicht_Signatur : 60|4@1+ (1,0) [0|15] "" Vector__XXX - -BO_ 982 Licht_hinten_01: 8 Gateway - SG_ BCM2_Bremsl_durch_ECD : 5|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High - SG_ LH_Aussenlicht_def : 7|1@1+ (1,0) [0|1] "" ZR_High - SG_ LH_Standlicht_H_aktiv : 8|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High - SG_ LH_Parklicht_HL_aktiv : 9|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High - SG_ LH_Parklicht_HR_aktiv : 10|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High - SG_ LH_Bremslicht_H_aktiv : 11|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High - SG_ LH_Nebelschluss_aktiv : 12|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High - SG_ LH_Rueckfahrlicht_aktiv : 13|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High - SG_ LH_Blinker_HL_akt : 14|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High - SG_ LH_Blinker_HR_akt : 15|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High - SG_ LH_Blinker_li_def : 16|1@1+ (1,0) [0|1] "" ZR_High - SG_ LH_Bremsl_li_def : 17|1@1+ (1,0) [0|1] "" ZR_High - SG_ LH_Schlusslicht_li_def : 18|1@1+ (1,0) [0|1] "" ZR_High - SG_ LH_Rueckf_li_def : 19|1@1+ (1,0) [0|1] "" ZR_High - SG_ LH_Nebel_li_def : 20|1@1+ (1,0) [0|1] "" ZR_High - SG_ LH_Schluss_Brems_Nebel_li_def : 21|1@1+ (1,0) [0|1] "" ZR_High - SG_ LH_Schluss_Brems_Nebel_re_def : 22|1@1+ (1,0) [0|1] "" ZR_High - SG_ LH_Zusatzschlussl_def : 23|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ LH_Schluss_Brems_li_def : 24|1@1+ (1,0) [0|1] "" ZR_High - SG_ LH_Schluss_Nebel_li_def : 25|1@1+ (1,0) [0|1] "" ZR_High - SG_ LH_SL_BRL_BLK_li_def : 26|1@1+ (1,0) [0|1] "" ZR_High - SG_ LH_Brems_Blk_li_def : 27|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ LH_Diag_Status_re_def : 28|1@1+ (1,0) [0|1] "" ZR_High - SG_ LH_Diag_Status_li_def : 29|1@1+ (1,0) [0|1] "" ZR_High - SG_ LH_Diag_LED_li_def : 30|1@1+ (1,0) [0|1] "" ZR_High - SG_ LH_Diag_LED_re_def : 31|1@1+ (1,0) [0|1] "" ZR_High - SG_ LH_Blinker_re_def : 32|1@1+ (1,0) [0|1] "" ZR_High - SG_ LH_Bremsl_re_def : 33|1@1+ (1,0) [0|1] "" ZR_High - SG_ LH_Schlusslicht_re_def : 34|1@1+ (1,0) [0|1] "" ZR_High - SG_ LH_Rueckf_re_def : 35|1@1+ (1,0) [0|1] "" ZR_High - SG_ LH_Nebel_re_def : 36|1@1+ (1,0) [0|1] "" ZR_High - SG_ LH_Schluss_Brems_mi_def : 37|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ LH_Schluss_Brems_re_def : 40|1@1+ (1,0) [0|1] "" ZR_High - SG_ LH_Schluss_Nebel_re_def : 41|1@1+ (1,0) [0|1] "" ZR_High - SG_ LH_SL_BRL_BLK_re_def : 42|1@1+ (1,0) [0|1] "" ZR_High - SG_ LH_Brems_Blk_re_def : 43|1@1+ (1,0) [0|1] "" ZR_High - SG_ LH_Kennzl_def : 48|1@1+ (1,0) [0|1] "" ZR_High - SG_ LH_3_Bremsl_def : 49|1@1+ (1,0) [0|1] "" ZR_High - SG_ LH_Nebel_mi_def : 50|1@1+ (1,0) [0|1] "" ZR_High - SG_ LH_Rueckf_mi_def : 51|1@1+ (1,0) [0|1] "" ZR_High - SG_ LH_Schlusslicht_mi_def : 52|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ LH_Bremsl_mi_def : 53|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ LH_Bremsl_li_ges_def : 54|1@1+ (1,0) [0|1] "" ZR_High - SG_ LH_Bremsl_re_ges_def : 55|1@1+ (1,0) [0|1] "" ZR_High - -BO_ 987 Gateway_72: 8 Gateway_MQB - SG_ BCM_01_alt : 0|1@1+ (1,0) [0|1] "" Airbag_MQB - SG_ SMLS_01_alt : 1|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Otto_MQB - SG_ ZV_02_alt : 2|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB - SG_ Wischer_01_alt : 3|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB - SG_ Anhaenger_01_alt : 4|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB - SG_ Klima_Sensor_02_alt : 5|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB - SG_ VSG_01_alt : 6|1@1+ (1,0) [0|1] "" Airbag_MQB - SG_ Klima_01_alt : 7|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ WFS_01_alt : 8|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ Licht_Anf_01_alt : 9|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ ZV_HFS_offen : 20|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ ZV_HBFS_offen : 21|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ VS_VD_offen_ver : 22|1@1+ (1,0) [0|1] "" Airbag_MQB - SG_ VS_VD_zu_ver : 23|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ ZV_BT_offen : 24|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ BCM1_Rueckfahrlicht_Schalter : 25|1@1+ (1,0) [0|1] "" Airbag_MQB - SG_ ZV_FT_offen : 26|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB - SG_ Wischer_vorne_aktiv : 27|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB - SG_ AAG_Anhaenger_erkannt : 28|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB - SG_ BCM1_MH_Schalter : 29|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ ZV_HD_offen : 30|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ Waschen_vorne_aktiv : 31|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ KL_Thermomanagement : 32|2@1+ (1,0) [0|3] "" Vector__XXX - SG_ WFS_Schluessel_Fahrberecht : 34|4@1+ (1,0) [0|15] "" Vector__XXX - SG_ BCM1_RFahrlicht_Fzg_Anf : 38|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ BCM1_RFahrlicht_Ahg_Anf : 39|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ BH_Fernlicht : 49|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ BH_Blinker_li : 50|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Otto_MQB - SG_ BH_Blinker_re : 51|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Otto_MQB - SG_ BCM1_OBD_FStatus_ATemp : 52|4@1+ (1,0) [0|15] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB - SG_ BCM1_Aussen_Temp_ungef : 56|8@1+ (0.5,-50) [-50|76] "Unit_DegreCelsi" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB - -BO_ 988 Gateway_73: 8 XXX - SG_ UNKNOWN_1 : 15|2@0+ (1,0) [0|3] "" XXX - SG_ GE_Fahrstufe : 40|4@1+ (1,0) [0|15] "" XXX - SG_ EPB_Status : 53|3@1+ (1,0) [0|7] "" XXX - SG_ UNKNOWN_2 : 58|3@0+ (1,0) [0|7] "" XXX - -BO_ 997 TSG_FT_02: 8 Gateway - SG_ TSG_FT_02_CRC : 0|8@1+ (1,0) [0|255] "" Vector__XXX - SG_ TSG_FT_02_BZ : 8|4@1+ (1,0) [0|15] "" Vector__XXX - SG_ FT_Tuer_Status : 12|2@1+ (1,0) [0|3] "" OTA_FC,ZR_High - SG_ FT_Tuer_Status_QBit : 14|1@1+ (1,0) [0|1] "" ZR_High - SG_ FT_Lock_Taster_02 : 15|1@1+ (1,0) [0|1] "" ZR_High - SG_ FT_Schluesselschalter_zu_02 : 16|1@1+ (1,0) [0|1] "" ZR_High - SG_ FT_BFS_Tuer_Status : 17|2@1+ (1,0) [0|3] "" ZR_High - SG_ FT_HBFS_Tuer_Status : 19|2@1+ (1,0) [0|3] "" ZR_High - SG_ FT_HFS_Tuer_Status : 21|2@1+ (1,0) [0|3] "" ZR_High - SG_ FT_Tueroeffnen_Warnung : 23|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ FT_SP_Heizung_ein : 24|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ FT_Kisi_Taster_li_02 : 25|1@1+ (1,0) [0|1] "" ZR_High - SG_ FT_Kisi_Taster_re_02 : 26|1@1+ (1,0) [0|1] "" ZR_High - SG_ FT_TD_Taste_Status : 27|2@1+ (1,0) [0|3] "" ZR_High - SG_ FT_TCR_Mode_aktiv : 29|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ FS_Push_Tuergriff : 36|1@1+ (1,0) [0|1] "" Vector__XXX - -BO_ 1004 MEB_TSK_01: 8 XXX - SG_ TSK_State : 53|3@1+ (1,0) [0|7] "" XXX - -BO_ 1031 PLA_04: 8 XXX - -BO_ 1122 PSD_04: 8 ZR_High - SG_ PSD_Segment_ID : 0|6@1+ (1,0) [2|63] "" Gateway,Gateway_PAG - SG_ PSD_Vorgaenger_Segment_ID : 6|6@1+ (1,0) [2|63] "" Gateway,Gateway_PAG - SG_ PSD_Segmentlaenge : 12|7@1+ (2,0) [0|254] "Unit_Meter" Gateway,Gateway_PAG,OTA_FC - SG_ PSD_Strassenkategorie : 19|3@1+ (1,0) [0|7] "" Gateway,Gateway_PAG,OTA_FC - SG_ PSD_Endkruemmung : 22|8@1+ (1,0) [0|254] "Unit_None" Gateway,Gateway_PAG - SG_ PSD_Endkruemmung_Vorz : 30|1@1+ (1,0) [0|1] "" Gateway,Gateway_PAG - SG_ PSD_Idenditaets_ID : 31|6@1+ (1,0) [2|63] "" Gateway,Gateway_PAG - SG_ PSD_ADAS_Qualitaet : 37|1@1+ (1,0) [0|1] "" Gateway,Gateway_PAG - SG_ PSD_wahrscheinlichster_Pfad : 38|1@1+ (1,0) [0|1] "" Gateway,Gateway_PAG - SG_ PSD_Geradester_Pfad : 39|1@1+ (1,0) [0|1] "" Gateway,Gateway_PAG - SG_ PSD_Fahrspuren_Anzahl : 40|3@1+ (1,0) [0|7] "" Gateway,Gateway_PAG,OTA_FC - SG_ PSD_Bebauung : 43|1@1+ (1,0) [0|1] "" Gateway,Gateway_PAG - SG_ PSD_Segment_Komplett : 44|1@1+ (1,0) [0|1] "" Gateway,Gateway_PAG - SG_ PSD_Rampe : 45|2@1+ (1,0) [0|3] "" Gateway,Gateway_PAG - SG_ PSD_Anfangskruemmung : 47|8@1+ (1,0) [0|254] "" Gateway,Gateway_PAG - SG_ PSD_Anfangskruemmung_Vorz : 55|1@1+ (1,0) [0|1] "" Gateway,Gateway_PAG - SG_ PSD_Abzweigerichtung : 56|1@1+ (1,0) [0|1] "" Gateway,Gateway_PAG - SG_ PSD_Abzweigewinkel : 57|7@1+ (1.417323,0) [0|180.000021] "" Gateway,Gateway_PAG - -BO_ 1123 PSD_05: 8 ZR_High - SG_ PSD_Pos_Segment_ID : 0|6@1+ (1,0) [2|63] "" Gateway,Gateway_PAG - SG_ PSD_Pos_Segmentlaenge : 6|7@1+ (2,0) [0|254] "Unit_Meter" Gateway,Gateway_PAG - SG_ PSD_Pos_Inhibitzeit : 13|5@1+ (10,0) [0|310] "Unit_MilliSecon" Gateway,Gateway_PAG - SG_ PSD_Pos_Standort_Eindeutig : 18|1@1+ (1,0) [0|1] "" Gateway,Gateway_PAG - SG_ PSD_Pos_Fehler_Laengsrichtung : 19|3@1+ (1,0) [0|7] "" Gateway,Gateway_PAG - SG_ PSD_Pos_Fahrspur : 22|3@1+ (1,0) [0|7] "" Gateway,Gateway_PAG,OTA_FC - SG_ PSD_Attribut_Segment_ID_05 : 25|6@1+ (1,0) [2|63] "" Gateway,Gateway_PAG - SG_ PSD_Attribut_1_ID : 31|5@1+ (1,0) [1|31] "" Gateway,Gateway_PAG - SG_ PSD_Attribut_1_Wert : 36|4@1+ (1,0) [0|15] "" Gateway,Gateway_PAG - SG_ PSD_Attribut_1_Offset : 40|7@1+ (2,0) [0|254] "Unit_Meter" Gateway,Gateway_PAG - SG_ PSD_Attribut_2_ID : 47|5@1+ (1,0) [1|31] "" Gateway,Gateway_PAG - SG_ PSD_Attribut_2_Wert : 52|4@1+ (1,0) [0|15] "" Gateway,Gateway_PAG - SG_ PSD_Attribut_2_Offset : 56|7@1+ (2,0) [0|254] "Unit_Meter" Gateway,Gateway_PAG - SG_ PSD_Attribute_Komplett_05 : 63|1@1+ (1,0) [0|1] "" Gateway,Gateway_PAG - -BO_ 1124 PSD_06: 8 ZR_High - SG_ PSD_06_Mux M : 0|3@1+ (1,0) [0|7] "" Gateway,Gateway_PAG - SG_ PSD_Sys_Segment_ID m0 : 3|6@1+ (1,0) [2|63] "" Gateway,Gateway_PAG - SG_ PSD_Sys_Laendercode m0 : 9|8@1+ (1,0) [0|255] "" Gateway,Gateway_PAG - SG_ PSD_Sys_Geschwindigkeit_Einheit m0 : 17|1@1+ (1,0) [0|1] "" Gateway,Gateway_PAG - SG_ PSD_Sys_Verkehrsrichtung m0 : 18|1@1+ (1,0) [0|1] "" Gateway,Gateway_PAG - SG_ PSD_Sys_Geometrieguete m0 : 19|2@1+ (1,0) [0|3] "" Gateway,Gateway_PAG - SG_ PSD_Sys_Mapmatchingguete m0 : 21|2@1+ (1,0) [0|3] "" Gateway,Gateway_PAG - SG_ PSD_Sys_Alter_Karte m0 : 23|3@1+ (1,0) [0|7] "" Gateway,Gateway_PAG - SG_ PSD_Sys_Zielfuehrung m0 : 26|1@1+ (1,0) [0|1] "" Gateway,Gateway_PAG,OTA_FC - SG_ PSD_Sys_US_State m0 : 27|6@1+ (1,0) [0|63] "" Gateway,Gateway_PAG - SG_ PSD_Sys_Quali_Geometrien m0 : 33|3@1+ (1,0) [0|7] "Unit_None" Gateway,Gateway_PAG - SG_ PSD_Sys_Quali_Ortsinfo m0 : 36|2@1+ (1,0) [0|3] "Unit_None" Gateway,Gateway_PAG - SG_ PSD_Sys_Quali_verfuegbar m0 : 38|1@1+ (1,0) [0|1] "" Gateway,Gateway_PAG - SG_ PSD_Sys_Zielfuehrung_geaendert m0 : 39|1@1+ (1,0) [0|1] "" Gateway,Gateway_PAG - SG_ PSD_Sys_Geometrieguete_erweitert m0 : 40|8@1+ (1,0) [0|255] "" Gateway,Gateway_PAG - SG_ PSD_Sys_Quali_sonstige_Attribute m0 : 48|3@1+ (1,0) [0|7] "Unit_None" Gateway,Gateway_PAG - SG_ PSD_Sys_Quali_Steigungen m0 : 51|3@1+ (1,0) [0|7] "" Gateway,Gateway_PAG - SG_ PSD_Sys_Quali_Strassenkennz m0 : 54|3@1+ (1,0) [0|7] "Unit_None" Gateway,Gateway_PAG - SG_ PSD_Sys_Quali_Tempolimits m0 : 57|3@1+ (1,0) [0|7] "Unit_None" Gateway,Gateway_PAG - SG_ PSD_Sys_Quali_Vorfahrtsregelung m0 : 60|3@1+ (1,0) [0|7] "Unit_None" Gateway,Gateway_PAG - SG_ PSD_Attribut_Segment_ID m1 : 3|6@1+ (1,0) [2|63] "" Gateway,Gateway_PAG - SG_ PSD_Attribut_3_ID m1 : 9|5@1+ (1,0) [1|31] "" Gateway,Gateway_PAG - SG_ PSD_Attribut_3_Offset m1 : 14|7@1+ (2,0) [0|254] "Unit_Meter" Gateway,Gateway_PAG - SG_ PSD_Attribut_3_Wert m1 : 21|4@1+ (1,0) [0|15] "" Gateway,Gateway_PAG - SG_ PSD_Attribut_4_ID m1 : 25|5@1+ (1,0) [1|31] "" Gateway,Gateway_PAG - SG_ PSD_Attribut_4_Wert m1 : 30|4@1+ (1,0) [0|15] "" Gateway,Gateway_PAG - SG_ PSD_Attribut_4_Offset m1 : 34|7@1+ (2,0) [0|254] "Unit_Meter" Gateway,Gateway_PAG - SG_ PSD_Attribut_5_ID m1 : 41|5@1+ (1,0) [1|31] "" Gateway,Gateway_PAG - SG_ PSD_Attribut_5_Offset m1 : 46|7@1+ (2,0) [0|254] "Unit_Meter" Gateway,Gateway_PAG - SG_ PSD_Attribut_5_Wert m1 : 53|4@1+ (1,0) [0|15] "" Gateway,Gateway_PAG - SG_ PSD_Attribute_Komplett_06 m1 : 57|1@1+ (1,0) [0|1] "" Gateway,Gateway_PAG - SG_ PSD_Ges_Segment_ID m2 : 3|6@1+ (1,0) [2|63] "" Gateway,Gateway_PAG - SG_ PSD_Ges_Offset m2 : 9|7@1+ (2,0) [0|254] "Unit_Meter" Gateway,Gateway_PAG - SG_ PSD_Ges_Geschwindigkeit m2 : 16|5@1+ (1,0) [0|31] "" Gateway,Gateway_PAG,OTA_FC - SG_ PSD_Ges_Typ m2 : 21|2@1+ (1,0) [0|3] "" Gateway,Gateway_PAG - SG_ PSD_Ges_Spur_Geschw_Begrenzung m2 : 23|6@1+ (1,0) [0|63] "" Gateway,Gateway_PAG - SG_ PSD_Ges_Geschwindigkeit_Gespann m2 : 29|2@1+ (1,0) [0|3] "" Gateway,Gateway_PAG - SG_ PSD_Ges_Geschwindigkeit_Witter m2 : 31|2@1+ (1,0) [0|3] "" Gateway,Gateway_PAG - SG_ PSD_Ges_Geschwindigkeit_Tag_Anf m2 : 33|3@1+ (1,0) [0|7] "" Gateway,Gateway_PAG - SG_ PSD_Ges_Geschwindigkeit_Tag_Ende m2 : 36|3@1+ (1,0) [0|7] "" Gateway,Gateway_PAG - SG_ PSD_Ges_Geschwindigkeit_Std_Anf m2 : 39|5@1+ (1,0) [0|24] "Unit_Hours" Gateway,Gateway_PAG - SG_ PSD_Ges_Geschwindigkeit_Std_Ende m2 : 44|5@1+ (1,0) [0|24] "Unit_Hours" Gateway,Gateway_PAG - SG_ PSD_Ges_Ueberholverbot m2 : 49|2@1+ (1,0) [0|3] "" Gateway,Gateway_PAG - SG_ PSD_Ges_Wechselverkehrszeichen m2 : 51|3@1+ (1,0) [0|7] "" Gateway,Gateway_PAG - SG_ PSD_Wechselverkehrszeichen_Typ m2 : 54|2@1+ (1,0) [0|3] "" Gateway,Gateway_PAG - SG_ PSD_Ges_Gesetzlich_Kategorie m2 : 56|3@1+ (1,0) [0|7] "" Gateway,Gateway_PAG - SG_ PSD_Ges_Gesetzlich_Zusatz m2 : 59|2@1+ (1,0) [0|3] "" Gateway,Gateway_PAG - SG_ PSD_Ges_Verkehrszeichen_Quelle m2 : 61|2@1+ (1,0) [0|3] "" Gateway,Gateway_PAG - SG_ PSD_Ges_Attribute_Komplett m2 : 63|1@1+ (1,0) [0|1] "" Gateway,Gateway_PAG - SG_ PSD_Baum_Laenge_VZ m3 : 3|1@1+ (1,0) [0|1] "" Gateway,Gateway_PAG - SG_ PSD_Baum_Laenge m3 : 4|25@1+ (1e-05,0) [0|180] "Unit_DegreOfArc" Gateway,Gateway_PAG - SG_ PSD_Baum_Breite_VZ m3 : 29|1@1+ (1,0) [0|1] "" Gateway,Gateway_PAG - SG_ PSD_Baum_Breite m3 : 30|24@1+ (1e-05,0) [0|90] "Unit_DegreOfArc" Gateway,Gateway_PAG - SG_ PSD_Baum_Ausrichtung m3 : 54|10@1+ (0.3515625,0) [0|359.6484375] "Unit_DegreOfArc" Gateway,Gateway_PAG - SG_ PSD_Steigung_1_Segment_ID m4 : 3|6@1+ (1,0) [2|63] "" Gateway,Gateway_PAG - SG_ PSD_Steigung_1_A_Steigung m4 : 9|7@1+ (0.12,0) [0|15] "Unit_PerCent" Gateway,Gateway_PAG - SG_ PSD_Steigung_1_A_Vorz m4 : 16|1@1+ (1,0) [0|1] "" Gateway,Gateway_PAG - SG_ PSD_Steigung_1_A_Offset m4 : 17|7@1+ (2,0) [0|254] "Unit_Meter" Gateway,Gateway_PAG - SG_ PSD_Steigung_1_B_Steigung m4 : 24|7@1+ (0.12,0) [0|15] "Unit_PerCent" Gateway,Gateway_PAG - SG_ PSD_Steigung_1_B_Vorz m4 : 31|1@1+ (1,0) [0|1] "" Gateway,Gateway_PAG - SG_ PSD_Steigung_1_B_Offset m4 : 32|7@1+ (2,0) [0|254] "Unit_Meter" Gateway,Gateway_PAG - SG_ PSD_Steigung_1_Attribute_kompl m4 : 39|1@1+ (1,0) [0|1] "" Gateway,Gateway_PAG - SG_ PSD_Steigung_2_Segment_ID m4 : 40|6@1+ (1,0) [2|63] "" Gateway,Gateway_PAG - SG_ PSD_Steigung_2_Steigung m4 : 46|7@1+ (0.12,0) [0|15] "Unit_PerCent" Gateway,Gateway_PAG - SG_ PSD_Steigung_2_Vorz m4 : 53|1@1+ (1,0) [0|1] "" Gateway,Gateway_PAG - SG_ PSD_Steigung_2_Offset m4 : 54|7@1+ (2,0) [0|254] "Unit_Meter" Gateway,Gateway_PAG - SG_ PSD_Steigung_2_Attribute_kompl m4 : 61|1@1+ (1,0) [0|1] "" Gateway,Gateway_PAG - -BO_ 1153 MainUnit_01: 8 ZR_High - SG_ ZR_LoGeWa_Event_Kombiwarnung : 0|4@1+ (1,0) [0|15] "" Gateway,Gateway_PAG - SG_ Nav_FoD_Status : 4|3@1+ (1,0) [0|7] "" Gateway,Gateway_PAG - SG_ MIB_Tongenerator_PH_verfuegbar : 9|3@1+ (1,0) [0|7] "" Gateway,Gateway_PAG - SG_ MMI_Counter_Bedienevent : 12|4@1+ (1,0) [0|15] "" Gateway,Gateway_PAG - SG_ DSSS_Warning : 16|5@1+ (1,0) [0|31] "" Gateway,Gateway_PAG - SG_ ZR_Kindersicherung_RSE : 21|1@1+ (1,0) [0|1] "" Gateway,Gateway_PAG - SG_ ZR_RSE_aktivieren : 22|1@1+ (1,0) [0|1] "" Gateway,Gateway_PAG - SG_ MMI_SDS_aktiv : 23|1@1+ (1,0) [0|1] "" Gateway,Gateway_PAG - SG_ MU_SecondDisplay : 24|3@1+ (1,0) [0|7] "" Gateway,Gateway_PAG - SG_ MMI_Telefon_aktiv : 27|1@1+ (1,0) [0|1] "" Gateway,Gateway_PAG - SG_ MMI_Gurt_Mic_ref : 28|1@1+ (1,0) [0|1] "" Gateway,Gateway_PAG,GurtMikrofon - SG_ ZR_Sta_Inszenierung : 29|2@1+ (1,0) [0|3] "" Gateway,Gateway_PAG - SG_ MMI_Gauges_active : 31|1@1+ (1,0) [0|1] "" BedienDisp_vo,Gateway,Gateway_PAG - SG_ MU_Update_Time : 32|8@1+ (0.1,0) [0|25.5] "Unit_Hours" Gateway,Gateway_PAG - SG_ ZR_MXB_Manoever_Ansage : 42|2@1+ (1,0) [0|3] "" Gateway,Gateway_PAG - SG_ ZR_LAPP_Sondermodus_Status : 44|2@1+ (1,0) [0|3] "" DDA,Gateway,Gateway_PAG - SG_ MMI_StartStopp_Info : 46|2@1+ (1,0) [0|3] "" Gateway,Gateway_PAG - SG_ ZR_Parken_Sondermodus : 48|4@1+ (1,0) [0|15] "" DDA,Gateway,Gateway_PAG - SG_ ZR_Rundenbewertung : 52|4@1+ (1,0) [0|15] "" Gateway,Gateway_PAG - SG_ ZR_Rundenfortschritt : 56|8@1+ (0.5,0) [0|100] "Unit_PerCent" Gateway,Gateway_PAG - -BO_ 1155 Motor_Hybrid_06: 8 Gateway - SG_ Mo_Powermeter_Grenze : 0|12@1+ (1,0) [0|4092] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3 - SG_ MO_Text_Aktivierung_Antrieb : 12|4@1+ (1,0) [0|15] "" Vector__XXX - SG_ MO_Powermeter_Inszenierung_aktiv : 17|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ MO_Powermeter_Charge_Grenze : 18|10@1+ (1,0) [0|1021] "Unit_None" Vector__XXX - SG_ MO_Powermeter_Grenze_strategisch : 28|12@1+ (1,0) [0|4093] "Unit_None" Vector__XXX - SG_ MO_Powermeter_untere_E_Grenze : 40|12@1+ (1,0) [0|4093] "Unit_None" Vector__XXX - SG_ MO_Powermeter_obere_E_Grenze : 52|12@1+ (1,0) [0|4093] "Unit_None" Vector__XXX - -BO_ 1163 BEM_06: 8 XXX - SG_ CRC : 0|8@1+ (1,0) [0|255] "" XXX - SG_ CHK : 8|4@1+ (1,0) [0|15] "" XXX - -BO_ 1175 Parkhilfe_01: 8 Gateway - SG_ PH_Visualisierung : 0|3@1+ (1,0) [0|7] "" AWC - SG_ PDC_Tonausgabe_Front : 4|4@1+ (1,0) [0|15] "" Vector__XXX - SG_ PDC_Tonausgabe_Heck : 8|4@1+ (1,0) [0|15] "" Vector__XXX - SG_ PH_nachtr_Stopp_Anf : 12|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ PH_Abschaltursache : 13|3@1+ (1,0) [0|7] "" AWC - SG_ PH_Opt_Anzeige_V_ein : 16|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ PH_Opt_Anzeige_H_ein : 17|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ PH_Opt_Anz_V_Hindernis : 18|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ PH_Opt_Anz_H_Hindernis : 19|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ PH_Tongeber_V_aktiv : 20|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ PH_Tongeber_H_aktiv : 21|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ PH_Tongeber_mute : 22|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ PH_Anf_Audioabsenkung : 23|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ PH_Tongeber_H_verfuegbar : 24|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ PLA_Anf_Aufschaltung_RVC : 25|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ PH_Taster : 28|2@1+ (1,0) [0|3] "" Vector__XXX - SG_ PH_Anf_Verdeck : 30|2@1+ (1,0) [0|3] "" Vector__XXX - SG_ PH_Frequenz_hinten : 32|4@1+ (1,0) [0|15] "" Vector__XXX - SG_ PH_Lautstaerke_hinten : 36|4@1+ (1,0) [0|15] "" Vector__XXX - SG_ PH_Frequenz_vorn : 40|4@1+ (1,0) [0|15] "" Vector__XXX - SG_ PH_Lautstaerke_vorn : 44|4@1+ (1,0) [0|15] "" Vector__XXX - SG_ PH_StartStopp_Info : 49|2@1+ (1,0) [0|3] "" Vector__XXX - SG_ PH_Stoermeldung : 52|4@1+ (1,0) [0|15] "" Vector__XXX - SG_ PH_defekt : 56|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ PH_gestoert : 57|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ PH_Systemzustand : 58|3@1+ (1,0) [0|7] "" AWC - SG_ PH_Display_Kundenwunsch : 61|2@1+ (1,0) [0|3] "" Vector__XXX - -BO_ 1283 HVK_01: 8 Gateway - SG_ HVK_01_CRC : 0|8@1+ (1,0) [0|255] "" BMC_MLBevo,DCDC_800V_PAG,DCDC_HV,DCDC_HV_02,FCU_MLBevo_FCEV,Ladegeraet_2,Ladegeraet_Konzern,LE1,LE2,LE_MLBevo,TME - SG_ HVK_01_BZ : 8|4@1+ (1,0) [0|15] "" BMC_MLBevo,DCDC_800V_PAG,DCDC_HV,DCDC_HV_02,FCU_MLBevo_FCEV,Ladegeraet_2,Ladegeraet_Konzern,LE1,LE2,LE_MLBevo,TME - SG_ HVK_Istmodus_Anf : 12|1@1+ (1,0) [0|1] "" BMC_MLBevo,DCDC_HV,FCU_MLBevo_FCEV,Ladegeraet_2,Ladegeraet_Konzern,LE1,LE2,LE_MLBevo - SG_ HVK_TN1_Sollmodus : 13|2@1+ (1,0) [0|3] "" DCDC_HV_02,FCU_MLBevo_FCEV - SG_ HVK_MO_EmSollzustand : 16|8@1+ (1,0) [0|255] "" FCU_MLBevo_FCEV - SG_ HVK_BMS_Sollmodus : 24|3@1+ (1,0) [0|7] "" BMC_MLBevo,FCU_MLBevo_FCEV - SG_ HVK_DCDC_Sollmodus : 27|3@1+ (1,0) [0|7] "" DCDC_800V_PAG,DCDC_HV,FCU_MLBevo_FCEV,LE_MLBevo - SG_ HVK_EKK_Sollmodus : 30|3@1+ (1,0) [0|7] "" FCU_MLBevo_FCEV,TME - SG_ HVK_HVPTC_Sollmodus : 33|3@1+ (1,0) [0|7] "" FCU_MLBevo_FCEV,TME - SG_ HVK_HVLM_Sollmodus : 36|3@1+ (1,0) [0|7] "" DCDC_HV_02,FCU_MLBevo_FCEV,Ladegeraet_Konzern - SG_ HVK_HV_Netz_Warnungen : 39|2@1+ (1,0) [0|3] "" FCU_MLBevo_FCEV - SG_ HV_Bordnetz_aktiv : 41|1@1+ (1,0) [0|1] "" DCDC_HV_02,FCU_MLBevo_FCEV,Ladegeraet_Konzern,LE1,LE2,LE_MLBevo - SG_ HV_Bordnetz_Fehler : 42|1@1+ (1,0) [0|1] "" FCU_MLBevo_FCEV,Ladegeraet_Konzern,TME - SG_ HVK_Gesamtst_Spgfreiheit : 43|2@1+ (1,0) [0|3] "" FCU_MLBevo_FCEV - SG_ HVK_AktiveEntladung_Anf : 45|1@1+ (1,0) [0|1] "" DCDC_800V_PAG,DCDC_HV,DCDC_HV_02,FCU_MLBevo_FCEV,LE1,LE2,LE_MLBevo - SG_ HVK_Iso_Messung_Start : 50|3@1+ (1,0) [0|7] "" BMC_MLBevo,FCU_MLBevo_FCEV - SG_ HVK_DCDC_EKK_Sollmodus : 62|2@1+ (1,0) [0|3] "" DCDC_800V_PAG,FCU_MLBevo_FCEV - -BO_ 1312 Airbag_02: 8 Gateway - SG_ LoGeWa_Event_Kombiwarnung : 12|4@1+ (1,0) [0|15] "" ZR_High - SG_ AB_Anforderung_eCall : 16|1@1+ (1,0) [0|1] "" ZR_High - SG_ AB_Anprall_Seite_Beifahrer : 17|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ AB_Anprall_Rollover : 18|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ AB_Anprall_FGS : 19|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ AB_Anprall_Front_Beifahrer : 20|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ AB_Anprall_Front_Fahrer : 21|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ AB_Anprall_Heck_Beifahrer : 22|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ AB_Anprall_Heck_Fahrer : 23|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ AB_Wickelklappung_Reihe2_MI : 24|2@1+ (1,0) [0|3] "" Vector__XXX - SG_ AB_Belegung_VB : 26|2@1+ (1,0) [0|3] "" BedienSG_hi,GurtMikrofon,ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3 - SG_ AB_Abschaltanf_SIH_BF : 28|1@1+ (1,0) [0|1] "" ZR_High - SG_ AB_Anprall_Seite_Fahrer : 29|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ SC_PAO_Schriftzug_Anf : 30|2@1+ (1,0) [0|3] "" ZR_High - SG_ SC_PAO_ON_Anf : 32|2@1+ (1,0) [0|3] "" ZR_High - SG_ SC_PAO_OFF_Anf : 34|2@1+ (1,0) [0|3] "" ZR_High - SG_ AB_Crashschwere : 36|3@1+ (1,0) [0|7] "" Vector__XXX - SG_ AB_Anforderung_USM : 39|1@1+ (1,0) [0|1] "" ZR_Standard - SG_ AB_Gurtschloss_FA : 40|2@1+ (1,0) [0|3] "" BedienSG_hi,GurtMikrofon,ZR_High - SG_ AB_Gurtschloss_BF : 42|2@1+ (1,0) [0|3] "" BedienSG_hi,GurtMikrofon,ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3 - SG_ AB_Gurtschloss_Reihe2_FA : 44|2@1+ (1,0) [0|3] "" BedienSG_hi,ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3 - SG_ AB_Gurtschloss_Reihe2_MI : 46|2@1+ (1,0) [0|3] "" BedienSG_hi,ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3 - SG_ AB_Gurtschloss_Reihe2_BF : 48|2@1+ (1,0) [0|3] "" BedienSG_hi,ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3 - SG_ AB_Gurtschloss_Reihe3_FA : 50|2@1+ (1,0) [0|3] "" BedienSG_hi,ZR_High - SG_ AB_Gurtschloss_Reihe3_MI : 52|2@1+ (1,0) [0|3] "" BedienSG_hi,ZR_High - SG_ AB_Gurtschloss_Reihe3_BF : 54|2@1+ (1,0) [0|3] "" BedienSG_hi,ZR_High - SG_ AB_Sitzpos_Sens_FA : 56|2@1+ (1,0) [0|3] "" ZR_High - SG_ AB_Sitzpos_Sens_BF : 58|2@1+ (1,0) [0|3] "" ZR_High - SG_ AB_Wickelklappung_Reihe2_BF : 60|2@1+ (1,0) [0|3] "" ZR_High - SG_ AB_Wickelklappung_Reihe2_FA : 62|2@1+ (1,0) [0|3] "" ZR_High - -BO_ 1349 Airbag_04: 8 Gateway - SG_ AB_Gurtwarn_Reihe2_FA : 20|2@1+ (1,0) [0|3] "" Vector__XXX - SG_ AB_Gurtwarn_Reihe2_BF : 22|2@1+ (1,0) [0|3] "" Vector__XXX - SG_ AbstWarn_MV_FAS_Fkt_Status : 24|2@1+ (1,0) [0|3] "" ZR_High - SG_ WarnBrems_Charisma_Status : 26|2@1+ (1,0) [0|3] "" Vector__XXX - SG_ WarnBrems_Charisma_FahrPr : 28|4@1+ (1,0) [0|15] "" Vector__XXX - SG_ AB_Gurtwarn_Reihe2_MI : 32|2@1+ (1,0) [0|3] "" Vector__XXX - SG_ AB_Gurtwarn_Reihe3_FA : 34|2@1+ (1,0) [0|3] "" Vector__XXX - SG_ AB_Gurtwarn_Reihe3_MI : 36|2@1+ (1,0) [0|3] "" Vector__XXX - SG_ AB_Gurtwarn_Reihe3_BF : 38|2@1+ (1,0) [0|3] "" Vector__XXX - SG_ LGI_FAS_Fkt_Status : 40|2@1+ (1,0) [0|3] "" ZR_High - SG_ PreCrash_FAS_Fkt_Status : 42|3@1+ (1,0) [0|7] "" ZR_High - SG_ AB_SBR_hinten_verbau : 48|2@1+ (1,0) [0|3] "" Vector__XXX - SG_ AWV_Einstellung_System_ASG : 51|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ AWV_Einstellung_Warnung_ASG : 52|3@1+ (1,0) [0|7] "" Vector__XXX - SG_ SC_PreSense_Modus_Warnung_NV : 55|3@1+ (1,0) [0|7] "" Vector__XXX - SG_ SC_PreSense_Modus_Warnung_MV : 58|3@1+ (1,0) [0|7] "" Vector__XXX - SG_ SC_PreSense_Modus_System_MV : 61|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ SC_PreSense_Modus_System_NV : 62|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ SC_PreSense_Modus_System_KAS : 63|1@1+ (1,0) [0|1] "" Vector__XXX - -BO_ 1355 Parkhilfe_04: 8 Gateway - SG_ PH_Verschmutzungsmeldung : 12|4@1+ (1,0) [0|15] "" Vector__XXX - SG_ PH_Aufschaltursache : 16|5@1+ (1,0) [0|31] "" AWC - SG_ PH_Ton_Ausgabe : 21|3@1+ (1,0) [0|7] "" Vector__XXX - SG_ PH_Ton_Pausenlaenge : 24|8@1+ (1,0) [0|255] "" Vector__XXX - SG_ PH_Ton_Richtung : 49|3@1+ (1,0) [0|7] "" Vector__XXX - SG_ PH_Ton_Lautstaerke : 52|3@1+ (1,0) [0|7] "" Vector__XXX - SG_ BCM_WAH_Meldung : 55|3@1+ (1,0) [0|7] "" Vector__XXX - SG_ PDC_Charisma_Status : 58|2@1+ (1,0) [0|3] "" Vector__XXX - SG_ PDC_Charisma_FahrPr : 60|4@1+ (1,0) [0|15] "" Vector__XXX - -BO_ 1361 WFS_01: 8 Gateway - SG_ WFS_Schluessel_Fahrberecht : 0|4@1+ (1,0) [0|15] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard - SG_ WFS_ID_Geb_autorisiert : 5|1@1+ (1,0) [0|1] "" ZR_High - SG_ WFS_ID_Geb_autorisiert_in_Kl15 : 6|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ WFS_ID_Geb_steckt : 7|1@1+ (1,0) [0|1] "" ZR_High - SG_ WFS_Schluessel_Soll : 8|4@1+ (1,0) [0|15] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard - SG_ WFS_Schluessel_Ist : 12|4@1+ (1,0) [0|15] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard - SG_ WFS_Safe : 16|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ WFS_LZ : 17|2@1+ (1,0) [0|3] "" Vector__XXX - SG_ WFS_ELV_authorisiert : 19|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ WFS_LF_Aktiv : 20|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ WFS_Betrieb_Lesespule : 21|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ WFS_Klemmenfreigabe : 22|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ WFS_Fahrerhinweise : 34|2@1+ (1,0) [0|3] "" Vector__XXX - SG_ WFS_Parken_Status : 36|2@1+ (1,0) [0|3] "" Vector__XXX - -BO_ 1385 MEB_HVEM_03: 8 XXX - SG_ NEW_SIGNAL_12 : 0|1@0+ (1,0) [0|1] "" XXX - SG_ NEW_SIGNAL_1 : 1|2@1+ (1,0) [0|3] "" XXX - SG_ NEW_SIGNAL_10 : 3|1@0+ (1,0) [0|1] "" XXX - SG_ NEW_SIGNAL_2 : 4|2@1+ (1,0) [0|3] "" XXX - SG_ PTC_ON : 7|1@0+ (1,0) [0|1] "" XXX - SG_ NEW_SIGNAL_3 : 25|2@1+ (1,0) [0|3] "" XXX - SG_ NEW_SIGNAL_13 : 32|1@0+ (1,0) [0|1] "" XXX - SG_ NEW_SIGNAL_4 : 33|2@1+ (1,0) [0|3] "" XXX - SG_ NEW_SIGNAL_11 : 35|1@0+ (1,0) [0|1] "" XXX - SG_ NEW_SIGNAL_5 : 36|2@1+ (1,0) [0|3] "" XXX - SG_ NEW_SIGNAL_6 : 38|1@0+ (1,0) [0|1] "" XXX - SG_ PTC_ein_02 : 39|1@0+ (1,0) [0|1] "" XXX - SG_ PTC_ein_03 : 57|1@0+ (1,0) [0|1] "" XXX - SG_ PTC_ein_04 : 59|1@0+ (1,0) [0|1] "" XXX - SG_ NEW_SIGNAL_9 : 61|2@1+ (1,0) [0|3] "" XXX - -BO_ 1411 ZV_02: 8 Gateway - SG_ BCM_FH_Freigabe : 12|1@1+ (1,0) [0|1] "" BedienDisp_vo - SG_ BCM_Komfortfkt_Freigabe : 13|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ BCM_HSK_Freigabe : 14|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ BCM_Verdeck_Freigabe : 15|1@1+ (1,0) [0|1] "" ZR_High - SG_ ZV_verriegelt_intern_ist : 16|1@1+ (1,0) [0|1] "" DDA,OTA_FC,ZR_High - SG_ ZV_verriegelt_extern_ist : 17|1@1+ (1,0) [0|1] "" DDA,OTA_FC,ZR_High - SG_ ZV_verriegelt_intern_soll : 18|1@1+ (1,0) [0|1] "" ZR_High - SG_ ZV_verriegelt_extern_soll : 19|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard - SG_ ZV_gesafet_extern_ist : 20|1@1+ (1,0) [0|1] "" ZR_High - SG_ ZV_gesafet_extern_soll : 21|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3 - SG_ ZV_Einzeltuerentriegelung : 22|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ ZV_Heckeinzelentriegelung : 23|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ ZV_FT_offen : 24|1@1+ (1,0) [0|1] "" DDA,OTA_FC,ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard - SG_ ZV_BT_offen : 25|1@1+ (1,0) [0|1] "" DDA,OTA_FC,ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard - SG_ ZV_HFS_offen : 26|1@1+ (1,0) [0|1] "" DDA,OTA_FC,ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard - SG_ ZV_HBFS_offen : 27|1@1+ (1,0) [0|1] "" DDA,OTA_FC,ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard - SG_ ZV_HD_offen : 28|1@1+ (1,0) [0|1] "" DDA,OTA_FC,ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard - SG_ ZV_HS_offen : 29|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High - SG_ IRUE_aktiv : 30|1@1+ (1,0) [0|1] "" ZR_High - SG_ DWA_aktiv : 31|1@1+ (1,0) [0|1] "" ZR_High - SG_ HD_Hauptraste : 32|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High - SG_ HD_Vorraste : 33|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High - SG_ FFB_CarFinder : 38|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ FFB_Komfortoeffnen : 39|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ FFB_Komfortschliessen : 40|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ ZV_Schluessel_Zugang : 42|4@1+ (1,0) [0|15] "" ZR_High - SG_ ZV_SafeFunktion_aktiv : 46|1@1+ (1,0) [0|1] "" ZR_High - SG_ FBS_Warn_Schluessel_Batt : 47|1@1+ (1,0) [0|1] "" ZR_High - SG_ ZV_Oeffnungsmodus : 48|2@1+ (1,0) [0|3] "" Vector__XXX - SG_ HFS_verriegelt : 50|1@1+ (1,0) [0|1] "" OTA_FC - SG_ HFS_gesafet : 51|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ HBFS_verriegelt : 52|1@1+ (1,0) [0|1] "" OTA_FC - SG_ HBFS_gesafet : 53|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ ZV_ist_Zustand_verfuegbar : 54|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High - SG_ IRUE_Taster_Fkts_LED : 55|1@1+ (1,0) [0|1] "" ZR_High - SG_ ZV_Tankklappe_offen : 56|1@1+ (1,0) [0|1] "" ZR_High - SG_ ZV_Rollo_auf : 57|1@1+ (1,0) [0|1] "" ZR_High - SG_ ZV_Rollo_zu : 58|1@1+ (1,0) [0|1] "" ZR_High - SG_ ZV_SAD_auf : 59|1@1+ (1,0) [0|1] "" ZR_High - SG_ ZV_SAD_zu : 60|1@1+ (1,0) [0|1] "" ZR_High - SG_ BCM_Tankklappensteller_Fehler : 61|1@1+ (1,0) [0|1] "" ZR_High - SG_ ZV_verriegelt_soll : 62|2@1+ (1,0) [0|3] "" Vector__XXX - -BO_ 1413 Systeminfo_01: 8 Gateway - SG_ SI_Sammel_SG_Fehler : 0|6@1+ (1,0) [0|60] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard - SG_ SI_Diagnose_Aktiv : 7|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard - SG_ SI_QRS_Mode : 8|1@1+ (1,0) [0|1] "" BedienSG_hi,ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard - SG_ SI_T_Mode : 9|1@1+ (1,0) [0|1] "" BedienDisp_vo,BedienSG_hi,DDA,ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard - SG_ SI_NWDF : 10|1@1+ (1,0) [0|1] "" BedienDisp_vo,BedienSG_hi,DDA,ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard - SG_ SI_NWDF_gueltig : 11|1@1+ (1,0) [0|1] "" BedienDisp_vo,BedienSG_hi,DDA,ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard - SG_ SI_Sammelfehler : 12|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard - SG_ GW_KD_Fehler : 13|1@1+ (1,0) [0|1] "" ZR_High,ZR_MIB_TOP_ab_Gen3,ZR_Standard - SG_ SI_T_Schutz : 14|1@1+ (1,0) [0|1] "" BedienSG_hi,ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard - SG_ SI_BUS_01 : 16|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard - SG_ SI_BUS_02 : 17|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard - SG_ SI_BUS_03 : 18|1@1+ (1,0) [0|1] "" BedienSG_hi,DDA,ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard - SG_ SI_BUS_04 : 19|1@1+ (1,0) [0|1] "" BedienSG_hi,ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard - SG_ SI_BUS_05 : 20|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard - SG_ SI_BUS_06 : 21|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard - SG_ SI_BUS_07 : 22|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard - SG_ SI_BUS_08 : 23|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard - SG_ SI_BUS_09 : 24|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard - SG_ SI_BUS_10 : 25|1@1+ (1,0) [0|1] "" BedienSG_hi,DDA,ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard - SG_ SI_BUS_11 : 26|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard - SG_ SI_BUS_12 : 27|1@1+ (1,0) [0|1] "" DDA,ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard - SG_ SI_BUS_13 : 28|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard - SG_ SI_BUS_14 : 29|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard - SG_ SI_BUS_15 : 30|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard - SG_ SI_Bus_Identifikation : 32|8@1+ (1,0) [0|255] "" OTA_FC,ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard - SG_ SI_CAB : 40|24@1+ (1,0) [0|16777215] "" BedienSG_hi,OTA_FC,ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard - -BO_ 1420 Klemmen_Steuerung_01: 8 Gateway - SG_ Klemmen_Steuerung_01_CRC : 0|8@1+ (1,0) [0|255] "" Vector__XXX - SG_ Klemmen_Steuerung_01_BZ : 8|4@1+ (1,0) [0|15] "" Vector__XXX - SG_ KST_Txt_P_Gang : 16|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ KST_Txt_Panikabschaltung : 17|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ KST_Anf_Klemmenfreigabe_ELV : 18|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ KST_Txt_Komfortabschaltung : 19|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ KST_ZAT_betaetigt : 20|1@1+ (1,0) [0|1] "" ZR_High - SG_ KST_Unterdr_Zuendungsmeldung : 21|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ KST_aut_Abschaltung_Zuendung : 22|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ KST_Anf_ZV_Verriegelung : 24|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ Relais_VoKo_angesteuert : 25|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ RSt_Anforderung_HMS : 26|3@1+ (1,0) [0|7] "" Vector__XXX - -BO_ 1426 Kessy_04: 8 XXX - -BO_ 1440 RLS_01: 8 Gateway - SG_ LS_Helligkeit_IR : 0|8@1+ (400,0) [0|101200] "Unit_Lux" ZR_High - SG_ LS_Helligkeit_FW : 8|10@1+ (6,0) [0|6126] "Unit_Lux" ZR_High - SG_ LS_defekt : 22|1@1+ (1,0) [0|1] "" ZR_High - SG_ LS_Verbau : 23|1@1+ (1,0) [0|1] "" ZR_High - SG_ RS_Regenmenge : 24|4@1+ (10,0) [0|100] "Unit_PerCent" OTA_FC,ZR_High - SG_ RS_Verbau : 29|1@1+ (1,0) [0|1] "" ZR_High - SG_ RS_Verglasung_schliessen : 30|1@1+ (1,0) [0|1] "" ZR_High - SG_ RS_defekt : 31|1@1+ (1,0) [0|1] "" ZR_High - SG_ RS_Wischergeschwindigkeit : 32|3@1+ (1,0) [0|7] "" OTA_FC,ZR_High - SG_ RLS_Vorfeldhelligkeit_Boost : 35|4@1+ (1,0) [0|15] "" ZR_High - -BO_ 1442 BMS_04: 8 BMC_MLBevo - SG_ BMS_04_CRC : 0|8@1+ (1,0) [0|255] "" Gateway,Gateway_PAG,Sub_Gateway - SG_ BMS_04_BZ : 8|4@1+ (1,0) [0|15] "" Gateway,Gateway_PAG,Sub_Gateway - SG_ BMS_Status_ServiceDisconnect : 13|1@1+ (1,0) [0|1] "" DCDC_800V_PAG,DCDC_HV,Gateway,Gateway_PAG,Sub_Gateway - SG_ BMS_Status_Spgfreiheit : 14|2@1+ (1,0) [0|3] "" Gateway,Gateway_PAG,Sub_Gateway - SG_ BMS_OBD_Lampe_Anf : 16|1@1+ (1,0) [0|1] "" Gateway,Gateway_PAG,Sub_Gateway - SG_ BMS_IstModus : 17|3@1+ (1,0) [0|7] "" AWC,Gateway,Gateway_PAG,Ladegeraet_Konzern,LE1,LE2,LE2_3_MLBevo_LB,Sub_Gateway,TME - SG_ BMS_Fehlerstatus : 20|3@1+ (1,0) [0|7] "" AWC,DCDC_800V_PAG,DCDC_HV,Gateway,Gateway_PAG,Ladegeraet_Konzern,Sub_Gateway - SG_ BMS_Kapazitaet_02 : 23|11@1+ (0.2,0) [0|409.2] "Unit_AmperHour" Gateway,Gateway_PAG,Ladegeraet_Konzern,Sub_Gateway - SG_ BMS_Soll_SOC_HiRes : 53|11@1+ (0.05,0) [0|100] "Unit_PerCent" Gateway,Gateway_PAG,Sub_Gateway - -BO_ 1447 TM_01: 8 Gateway - SG_ TM_Spiegel_Anklappen : 47|1@1+ (1,0) [0|1] "" ZR_High - SG_ TM_Nur_Hupen : 48|1@1+ (1,0) [0|1] "" ZR_High - SG_ TM_Door_Lock : 49|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ TM_Door_Unlock : 50|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ TM_Warnblinken : 51|1@1+ (1,0) [0|1] "" ZR_High - SG_ TM_Panik_Alarm : 52|1@1+ (1,0) [0|1] "" ZR_High - SG_ TM_ZV_Signatur : 53|11@1+ (1,0) [1|2047] "Unit_None" Vector__XXX - -BO_ 1452 HVEM_02: 8 Gateway - SG_ HVEM_IstStrom_HVVerbraucher : 0|12@1+ (0.1,-204.7) [-204.7|204.6] "Unit_Amper" Vector__XXX - SG_ HVEM_Energie_Klima_Vorgabe_HighR : 12|3@1+ (10,0) [0|50] "Unit_WattHour" TME - SG_ HVEM_IstLeistungNA : 15|9@1+ (50,0) [0|25450] "Unit_Watt" Vector__XXX - SG_ HVEM_Leistung_Klima_Vorgabe : 24|8@1+ (50,0) [0|12650] "Unit_Watt" TME - SG_ HVEM_Nutzbare_Energie : 32|11@1+ (50,0) [0|102200] "Unit_WattHour" Ladegeraet_Konzern - SG_ HVEM_Energie_Klima_Vorgabe : 43|8@1+ (50,0) [0|12650] "Unit_WattHour" TME - SG_ HVEM_MO_MaxLeistungIgnoriert : 63|1@1+ (1,0) [0|1] "" Vector__XXX - -BO_ 1485 DCDC_03: 8 DCDC_800V_PAG - SG_ DCDC_03_CRC : 0|8@1+ (1,0) [0|255] "" Gateway,Gateway_PAG,Sub_Gateway - SG_ DCDC_03_BZ : 8|4@1+ (1,0) [0|15] "" Gateway,Gateway_PAG,Sub_Gateway - SG_ DC_Fehlerstatus : 16|3@1+ (1,0) [0|7] "" Gateway,Gateway_PAG,Sub_Gateway - SG_ DC_Peakstrom_verfuegbar : 19|1@1+ (1,0) [0|1] "" Gateway,Gateway_PAG,Sub_Gateway - SG_ DC_Abregelung_Temperatur : 20|1@1+ (1,0) [0|1] "" Gateway_PAG,Sub_Gateway,TME - SG_ DC_IstModus_02 : 21|3@1+ (1,0) [0|7] "" DCDC_HV_02,Gateway,Gateway_PAG,Ladegeraet_Konzern,Sub_Gateway,TME - SG_ DC_HV_EKK_IstModus : 28|3@1+ (1,0) [0|7] "" Gateway,Gateway_PAG,Sub_Gateway,TME - SG_ DC_Status_Spgfreiheit_HV : 46|2@1+ (1,0) [0|3] "" Gateway,Gateway_PAG,Sub_Gateway - SG_ DC_IstSpannung_EKK_HV : 48|8@1+ (2,0) [0|508] "Unit_Volt" Gateway,Gateway_PAG,Sub_Gateway - SG_ DC_Temperatur : 56|8@1+ (1,-40) [-40|213] "Unit_DegreCelsi" Gateway,Gateway_PAG,Sub_Gateway,TME - -BO_ 1505 Klima_Sensor_02: 8 Gateway - SG_ BCM1_Aussen_Temp_ungef : 0|8@1+ (0.5,-50) [-50|76] "Unit_DegreCelsi" BMC_MLBevo,BMS_NV,FCU_MLBevo_FCEV,Ladegeraet_Konzern,TME - SG_ BCM_Heizungsabsperrventil_Status : 8|2@1+ (1,0) [0|3] "" Vector__XXX - SG_ BCM_Heizungspumpe_Status : 10|2@1+ (1,0) [0|3] "" Vector__XXX - SG_ BCM_Kompressorkupplung_Status : 12|2@1+ (1,0) [0|3] "" Vector__XXX - SG_ BCM1_PTC_stufig_Status : 28|3@1+ (1,0) [0|7] "" Vector__XXX - SG_ BCM1_FStatus_Aussentemp_ungef : 31|1@1+ (1,0) [0|1] "" TME - SG_ BCM1_Kompressorstrom_ist : 32|8@1+ (4,0) [0|1000] "Unit_MilliAmper" Vector__XXX - SG_ BCM1_OBD_FStatus_ATemp : 44|4@1+ (1,0) [0|15] "" BMC_MLBevo,Ladegeraet_Konzern,TME - -BO_ 1513 Klima_Sensor_04: 8 Gateway - SG_ DS_Kaeltemittel_P : 8|11@1+ (0.0161,0) [0|32.9245] "Unit_Bar" TME - SG_ DS_Status : 19|2@1+ (1,0) [0|3] "" TME - SG_ ION_Status : 21|2@1+ (1,0) [0|3] "" Vector__XXX - SG_ ION_Status_LED : 23|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ AAU_Geblaese : 24|7@1+ (1,0) [0|100] "Unit_PerCent" Vector__XXX - SG_ ION_Status_Taster : 31|1@1+ (1,0) [0|1] "" Vector__XXX - -BO_ 1520 Dimmung_01: 8 Gateway_MQB - SG_ DI_KL_58xd : 0|8@1+ (1,0) [0|253] "" Airbag_MQB - SG_ DI_KL_58xs : 8|7@1+ (1,0) [0|100] "Unit_PerCent" Vector__XXX - SG_ DI_Display_Nachtdesign : 15|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ DI_KL_58xt : 16|7@1+ (1,0) [0|100] "Unit_PerCent" Vector__XXX - SG_ DI_Fotosensor : 24|16@1+ (1,0) [0|65535] "" Vector__XXX - -BO_ 1524 Innenlicht_11: 8 Gateway - SG_ IL_Dimmung_V_Tuerkontur : 0|8@1+ (1,0) [0|100] "Unit_PerCent" ZR_High - SG_ IL_Dimmung_H_Tuerkontur : 8|8@1+ (1,0) [0|100] "Unit_PerCent" ZR_High - SG_ IL_Dimmung_Tuerinnengriff : 16|8@1+ (1,0) [0|100] "Unit_PerCent" ZR_High - SG_ IL_Dimmung_Umfeldbel : 24|8@1+ (1,0) [0|100] "Unit_PerCent" ZR_High - SG_ IL_Bel_FS_Ausstieg : 32|1@1+ (1,0) [0|1] "" ZR_High - SG_ IL_Bel_BFS_Ausstieg : 33|1@1+ (1,0) [0|1] "" ZR_High - SG_ IL_Bel_HFS_Ausstieg : 34|1@1+ (1,0) [0|1] "" ZR_High - SG_ IL_Bel_HBFS_Ausstieg : 35|1@1+ (1,0) [0|1] "" ZR_High - SG_ BCM1_Innenlicht_gedimmt_V : 36|1@1+ (1,0) [0|1] "" ZR_High - SG_ BCM1_Innenlicht_gedimmt_H : 37|1@1+ (1,0) [0|1] "" ZR_High - SG_ IL_Innenlicht_aktiv : 38|1@1+ (1,0) [0|1] "" ZR_High - SG_ IL_Klemme_30G_aktiv : 39|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ BCM1_DI_Rampe_Innenlicht : 40|1@1+ (1,0) [0|1] "" ZR_High - SG_ BCM1_DI_Rampe_Leselicht : 41|1@1+ (1,0) [0|1] "" ZR_High - SG_ BCM1_Innenlicht_H : 42|1@1+ (1,0) [0|1] "" ZR_High - SG_ BCM1_Innenlicht_V : 43|1@1+ (1,0) [0|1] "" ZR_High - SG_ BCM1_Leselicht_Anf_hl : 44|1@1+ (1,0) [0|1] "" ZR_High - SG_ BCM1_Leselicht_Anf_hr : 45|1@1+ (1,0) [0|1] "" ZR_High - SG_ BCM1_Leselicht_Anf_vl : 46|1@1+ (1,0) [0|1] "" ZR_High - SG_ BCM1_Leselicht_Anf_vr : 47|1@1+ (1,0) [0|1] "" ZR_High - SG_ BCM1_Leuchten_Aus : 48|1@1+ (1,0) [0|1] "" ZR_High - SG_ AMB_Charisma_FahrPr : 49|4@1+ (1,0) [0|15] "" Vector__XXX - SG_ AMB_Charisma_Status : 53|2@1+ (1,0) [0|3] "" Vector__XXX - SG_ IL_Dimmung_Lautspr : 56|8@1+ (1,0) [0|100] "Unit_PerCent" ZR_High - -BO_ 1600 Motor_07: 8 Motor_Diesel_MQB - SG_ MO_QBit_Ansaugluft_Temp : 0|1@1+ (1,0) [0|1] "" Gateway_MQB - SG_ MO_QBit_Oel_Temp : 1|1@1+ (1,0) [0|1] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB - SG_ MO_QBit_Kuehlmittel_Temp : 2|1@1+ (1,0) [0|1] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,LEH_MQB - SG_ MO_Stellgliedtest_Soundaktuator : 3|1@1+ (1,0) [0|1] "" Gateway_MQB - SG_ MO_HYB_Fehler_HV_Netz : 4|1@1+ (1,0) [0|1] "" Gateway_MQB - SG_ MO_aktives_Getriebeheizen : 5|1@1+ (1,0) [0|1] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB - SG_ MO_Absperrventil_oeffnen : 6|2@1+ (1,0) [0|3] "" Gateway_MQB - SG_ MO_Ansaugluft_Temp : 8|8@1+ (0.75,-48) [-48|141.75] "Unit_DegreCelsi" Gateway_MQB - SG_ MO_Oel_Temp : 16|8@1+ (1,-60) [-60|192] "Unit_DegreCelsi" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB - SG_ MO_Kuehlmittel_Temp : 24|8@1+ (0.75,-48) [-48|141.75] "Unit_DegreCelsi" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,LEH_MQB - SG_ MO_Hoeheninfo : 32|8@1+ (0.00781,0) [0|1.98374] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB - SG_ MO_Kennfeldk : 40|1@1+ (1,0) [0|1] "" Gateway_MQB - SG_ MO_Versionsinfo : 41|6@1+ (1,0) [0|63] "" Gateway_MQB - SG_ MO_Getriebe_kuehlen : 47|1@1+ (1,0) [0|1] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB - SG_ MO_Mom_Traegheit_02 : 48|5@1+ (0.01,0) [0|0.31] "Unit_KiloGramMeterSquar" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB - SG_ MO_Heizungspumpenansteuerung : 53|4@1+ (10,0) [0|100] "Unit_PerCent" Gateway_MQB - SG_ MO_SpannungsAnf : 57|1@1+ (1,0) [0|1] "" Gateway_MQB - SG_ MO_Nachlaufzeit_Heizungspumpe : 58|6@1+ (15,0) [0|945] "Unit_Secon" Gateway_MQB - -BO_ 1601 Motor_Code_01: 8 Motor_Diesel_MQB - SG_ Motor_Code_01_CRC : 0|8@1+ (1,0) [0|255] "" Gateway_MQB - SG_ Motor_Code_01_BZ : 8|4@1+ (1,0) [0|15] "" Gateway_MQB - SG_ MO_Faktor_Momente_02 : 12|2@1+ (1,0) [0|3] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB - SG_ MO_Hybridfahrzeug : 14|2@1+ (1,0) [0|3] "" Gateway_MQB - SG_ MO_Code : 16|8@1+ (1,0) [0|255] "" Gateway_MQB,SAK_MQB - SG_ MO_Getriebe_Code : 24|6@1+ (1,0) [0|63] "" Gateway_MQB - SG_ MO_StartStopp_Codiert : 30|1@1+ (1,0) [0|1] "" Gateway_MQB - SG_ MO_Anzahl_Zyl : 32|4@1+ (1,0) [0|15] "" Gateway_MQB - SG_ MO_Kraftstoffart : 36|4@1+ (1,0) [0|15] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB - SG_ MO_Hubraum : 40|7@1+ (0.1,0) [0|12.7] "Unit_Liter" Gateway_MQB - SG_ MO_Ansaugsystem : 47|1@1+ (1,0) [0|1] "" Gateway_MQB - SG_ MO_Leistung : 48|9@1+ (1,0) [0|511] "Unit_KiloWatt" Gateway_MQB - SG_ MO_Abgastyp_EOBD : 57|1@1+ (1,0) [0|1] "" BMS_MQB,Gateway_MQB,LEH_MQB - SG_ MO_Abgastyp_OBD : 58|1@1+ (1,0) [0|1] "" BMS_MQB,Gateway_MQB,LEH_MQB - SG_ MO_DPF_verbaut : 59|1@1+ (1,0) [0|1] "" Gateway_MQB - SG_ TSK_Codierung : 60|3@1+ (1,0) [0|7] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB - SG_ MO_Einspritzart : 63|1@1+ (1,0) [0|1] "" Gateway_MQB - -BO_ 1603 Einheiten_01: 8 Gateway - SG_ KBI_Einheit_Datum : 0|2@1+ (1,0) [0|3] "" Vector__XXX - SG_ KBI_Einheit_Druck : 2|2@1+ (1,0) [0|3] "" Vector__XXX - SG_ KBI_Einheit_Streckenanz : 4|1@1+ (1,0) [0|1] "" Ladegeraet_Konzern - SG_ KBI_MFA_v_Einheit_02 : 5|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ KBI_Einheit_Temp : 6|1@1+ (1,0) [0|1] "" TME - SG_ KBI_Einheit_Uhrzeit : 7|1@1+ (1,0) [0|1] "" Ladegeraet_Konzern - SG_ KBI_Einheit_Verbrauch : 8|2@1+ (1,0) [0|3] "" Vector__XXX - SG_ KBI_Einheit_Volumen : 10|2@1+ (1,0) [0|3] "" Vector__XXX - SG_ KBI_Einheit_Verbrauch_elektr : 12|3@1+ (1,0) [0|7] "" Vector__XXX - SG_ KBI_Einheit_Sprache : 16|8@1+ (1,0) [0|255] "" Vector__XXX - SG_ KBI_Einheit_Verbrauch_Gas : 24|4@1+ (1,0) [0|15] "" Vector__XXX - SG_ KBI_Einheit_Masse : 28|2@1+ (1,0) [0|3] "" Vector__XXX - -BO_ 1622 ELV_01: 8 Gateway - SG_ ELV_01_CRC : 0|8@1+ (1,0) [0|255] "" Vector__XXX - SG_ ELV_01_BZ : 8|4@1+ (1,0) [0|15] "" Vector__XXX - SG_ ELV_Anf_Klemme_S : 12|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ ELV_Anf_Klemme_15 : 13|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ ELV_Anf_Klemme_50 : 14|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ ELV_01_Sendestatus : 15|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ ELV_Verriegelt : 16|1@1+ (1,0) [0|1] "" ZR_High - SG_ ELV_Entriegelt : 17|1@1+ (1,0) [0|1] "" ZR_High - SG_ ELV_ZAT_betaetigt : 18|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ ELV_Lebenszustand : 19|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ ELV_Anlernmodus : 20|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ ELV_Klemmenfreigabe : 22|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ ELV_Abbruch_Anf_Klemmenfreigabe : 23|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ ELV_LED_Rot : 24|1@1+ (1,0) [0|1] "" ZR_High - SG_ ELV_LED_Gelb : 25|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ ELV_Txt_Panikabschaltung : 27|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ ELV_Txt_Lkg_Bewegen : 28|1@1+ (1,0) [0|1] "" ZR_High - SG_ ELV_Txt_Werkstatt : 29|1@1+ (1,0) [0|1] "" ZR_High - SG_ ELV_Txt_Defekt : 30|1@1+ (1,0) [0|1] "" ZR_High - SG_ ELV_Txt_P_Gang : 31|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ ELV_Txt_PN_Gang : 32|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ ELV_Txt_Kupplung : 33|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ ELV_Txt_Bremse : 34|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ ELV_P_verriegelt : 35|1@1+ (1,0) [0|1] "" Vector__XXX - -BO_ 1624 Licht_vorne_01: 8 Gateway - SG_ Licht_Vorne_01_CRC : 0|8@1+ (1,0) [0|255] "" Vector__XXX - SG_ Licht_Vorne_01_BZ : 8|4@1+ (1,0) [0|15] "" Vector__XXX - SG_ LV_Standlicht_Anzeige : 12|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High - SG_ LV_Abblendlicht_Anzeige : 13|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High - SG_ LV_Fernlicht_Anzeige : 14|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High - SG_ LV_Nebellicht_Anzeige : 15|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High - SG_ LV_Nebelschlusslicht_Anzeige : 16|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High - SG_ LV_Tagfahrlicht_Anzeige : 17|1@1+ (1,0) [0|1] "" BedienSG_hi,OTA_FC,ZR_High - SG_ LV_AFL_aktiv_Anzeige : 18|1@1+ (1,0) [0|1] "" BedienSG_hi,OTA_FC,ZR_High - SG_ LV_AFL_defekt : 19|1@1+ (1,0) [0|1] "" ZR_High - SG_ LV_Blinker_li_def : 20|1@1+ (1,0) [0|1] "" ZR_High - SG_ LV_Standlicht_li_def : 21|1@1+ (1,0) [0|1] "" ZR_High - SG_ LV_Abblendlicht_li_def : 22|1@1+ (1,0) [0|1] "" ZR_High - SG_ LV_Fernlicht_li_def : 23|1@1+ (1,0) [0|1] "" ZR_High - SG_ LV_Nebellicht_li_def : 24|1@1+ (1,0) [0|1] "" ZR_High - SG_ LV_Blk_li_Seite_def : 25|1@1+ (1,0) [0|1] "" ZR_High - SG_ LV_Tagfahrlicht_li_def : 26|1@1+ (1,0) [0|1] "" ZR_High - SG_ LV_FLA_aktiv_Anzeige : 27|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High - SG_ LV_FLA_defekt : 28|1@1+ (1,0) [0|1] "" ZR_High - SG_ LV_FLA_Sensor_blockiert : 29|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High - SG_ LV_Blinker_re_def : 30|1@1+ (1,0) [0|1] "" ZR_High - SG_ LV_Standlicht_re_def : 31|1@1+ (1,0) [0|1] "" ZR_High - SG_ LV_Abblendlicht_re_def : 32|1@1+ (1,0) [0|1] "" ZR_High - SG_ LV_Fernlicht_re_def : 33|1@1+ (1,0) [0|1] "" ZR_High - SG_ LV_Nebellicht_re_def : 34|1@1+ (1,0) [0|1] "" ZR_High - SG_ LV_Blk_re_Seite_def : 35|1@1+ (1,0) [0|1] "" ZR_High - SG_ LV_Tagfahrlicht_re_def : 36|1@1+ (1,0) [0|1] "" ZR_High - SG_ LV_Aussenlicht_def : 37|1@1+ (1,0) [0|1] "" ZR_High - SG_ LV_Abblendlicht_TFL_li_def : 38|1@1+ (1,0) [0|1] "" ZR_High - SG_ LV_Nebellicht_TFL_li_def : 39|1@1+ (1,0) [0|1] "" ZR_High - SG_ LV_Standlicht_TFL_li_def : 40|1@1+ (1,0) [0|1] "" ZR_High - SG_ LV_Abblend_Fernlicht_li_def : 41|1@1+ (1,0) [0|1] "" ZR_High - SG_ LV_Abblendlicht_TFL_re_def : 42|1@1+ (1,0) [0|1] "" ZR_High - SG_ LV_Nebellicht_TFL_re_def : 43|1@1+ (1,0) [0|1] "" ZR_High - SG_ LV_Standlicht_TFL_re_def : 44|1@1+ (1,0) [0|1] "" ZR_High - SG_ LV_Abblend_Fernlicht_re_def : 45|1@1+ (1,0) [0|1] "" ZR_High - SG_ LV_Abbiegelicht_li_def : 46|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ LV_Abbiegelicht_re_def : 47|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ BCM1_Linksverkehr : 48|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High - SG_ BCM1_Licht_Dunkelheit_aktiv : 49|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High - SG_ LV_LED_Scheinwerfer_li_def : 50|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ LV_LED_Scheinwerfer_re_def : 51|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ LV_Blinker_VL_aktiv : 52|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High - SG_ LV_Blinker_VR_aktiv : 53|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High - SG_ LV_MXB_Status_Anzeige : 54|2@1+ (1,0) [0|3] "" Vector__XXX - -BO_ 1629 ESP_20: 8 Gateway - SG_ ESP_20_CRC : 0|8@1+ (1,0) [0|255] "" Vector__XXX - SG_ ESP_20_BZ : 8|4@1+ (1,0) [0|15] "" Vector__XXX - SG_ BR_Systemart : 12|2@1+ (1,0) [0|3] "" Vector__XXX - SG_ ESP_SpannungsAnf_02 : 14|2@1+ (1,0) [0|3] "" Vector__XXX - SG_ ESP_Zaehnezahl : 16|8@1+ (1,0) [0|255] "" Vector__XXX - SG_ ESP_Charisma_FahrPr : 24|4@1+ (1,0) [0|15] "" Vector__XXX - SG_ ESP_Charisma_Status : 28|2@1+ (1,0) [0|3] "" Vector__XXX - SG_ ESP_Wiederstart_Anz_01 : 30|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ ESP_Wiederstart_Anz_02 : 31|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ ESP_Wiederstart_Anz_03 : 32|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ ESP_Wiederstart_Anz_04 : 33|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ ESP_Stoppverbot_Anz_01 : 34|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ ESP_Stoppverbot_Anz_02 : 35|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ ESP_Stoppverbot_Anz_03 : 36|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ ESP_Stoppverbot_Anz_04 : 37|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ ESP_Stoppverbot_Anz_05 : 38|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ ESP_Stoppverbot_Anz_06 : 39|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ ESP_Stoppverbot_Anz_07 : 40|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ ESP_Stoppverbot_Anz_Std : 41|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ ESP_Dachrelingsensor : 42|2@1+ (1,0) [0|3] "" Vector__XXX - SG_ ESP_Stoppverbot_Anz_08 : 44|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ HDC_Charisma_FahrPr : 45|4@1+ (1,0) [0|15] "" Vector__XXX - SG_ HDC_Charisma_Status : 49|2@1+ (1,0) [0|3] "" Vector__XXX - SG_ BR_QBit_Reifenumfang : 51|1@1+ (1,0) [0|1] "" AWC - SG_ BR_Reifenumfang : 52|12@1+ (1,0) [0|4095] "Unit_MilliMeter" AWC - -BO_ 1631 Motor_16: 8 Gateway - SG_ TSK_Grundmasse : 0|8@1+ (32,0) [0|8128] "Unit_KiloGram" ZR_High - SG_ TSK_QBit_Steigung : 12|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ TSK_QBit_Fahrzeugmasse : 13|1@1+ (1,0) [0|1] "" ZR_High - SG_ MO_SpannungsAnf_02 : 14|2@1+ (1,0) [0|3] "" Vector__XXX - SG_ MO_DPF_reg : 16|1@1+ (1,0) [0|1] "" ZR_High - SG_ MO_Heizstrom_EKAT : 17|7@1+ (1,0) [0|126] "Unit_Amper" Vector__XXX - SG_ MO_Heizstrom_SCR : 24|6@1+ (1,0) [0|62] "Unit_Amper" Vector__XXX - SG_ MO_Anzeige_Kaltleuchte : 30|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ MO_P_Generator_ungefiltert_Anf : 31|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ TSK_Getriebeinfo : 34|2@1+ (1,0) [0|3] "" Vector__XXX - SG_ MO_Energieinhalt_BMS : 36|12@1+ (25,0) [0|102325] "Unit_WattHour" Vector__XXX - SG_ TSK_Fahrzeugmasse_02 : 48|8@1+ (32,0) [0|8128] "Unit_KiloGram" OTA_FC,ZR_High - SG_ TSK_Steigung_02 : 56|8@1+ (0.8,-101.6) [-100.8|101.6] "Unit_PerCent" OTA_FC - -BO_ 1640 Klima_12: 8 Gateway - SG_ KL_LRH_Taster : 0|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ KL_LRH_Stufe : 1|2@1+ (1,0) [0|3] "" Vector__XXX - SG_ HSH_Taster : 3|2@1+ (1,0) [0|3] "" Vector__XXX - SG_ FSH_Taster : 5|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ KL_Zuheizer_Freigabe : 6|1@1+ (1,0) [0|1] "" TME - SG_ KL_Beschlagsgefahr : 7|1@1+ (1,0) [0|1] "" TME - SG_ KL_SIH_Soll_li : 8|3@1+ (1,0) [0|7] "" TME - SG_ KL_SIH_Soll_re : 11|3@1+ (1,0) [0|7] "" TME - SG_ KRH_Soll_li : 14|2@1+ (1,0) [0|3] "" Vector__XXX - SG_ KL_SIL_Soll_li : 16|3@1+ (1,0) [0|7] "" TME - SG_ KL_SIL_Soll_re : 19|3@1+ (1,0) [0|7] "" TME - SG_ KRH_Soll_re : 22|2@1+ (1,0) [0|3] "" Vector__XXX - SG_ KL_Geblspng_Soll : 24|8@1+ (0.05,1.45) [1.5|14] "Unit_Volt" Vector__XXX - SG_ KL_Geblspng_Fond_Soll : 32|8@1+ (0.05,1.45) [1.5|14] "Unit_Volt" Vector__XXX - SG_ KL_I_Geblaese : 40|8@1+ (0.25,0) [0|63.5] "Unit_Amper" Vector__XXX - SG_ KL_Kompressorstrom_soll : 48|10@1+ (1,0) [0|1021] "" TME - SG_ KL_Umluftklappe_Status : 58|4@1+ (1,0) [0|15] "" TME - SG_ KL_PTC_Verbauinfo : 62|2@1+ (1,0) [0|3] "" Vector__XXX - -BO_ 1648 Motor_18: 8 Gateway - SG_ MO_max_Ladedruck : 0|6@1+ (0.1,0) [0|6.3] "Unit_Bar" Sub_Gateway - SG_ MO_ANC_Kennfeld_Anf : 6|2@1+ (1,0) [0|3] "" Sub_Gateway - SG_ MO_Bremslicht_Reku : 8|1@1+ (1,0) [0|1] "" Sub_Gateway - SG_ MO_StartStopp_PopUp : 9|2@1+ (1,0) [0|3] "" Sub_Gateway - SG_ MO1_Sperr_Info_WFS : 11|1@1+ (1,0) [0|1] "" Sub_Gateway - SG_ MO1_Freigabe_Info_WFS : 12|1@1+ (1,0) [0|1] "" Sub_Gateway - SG_ MO_EPCL : 13|3@1+ (1,0) [0|7] "" Sub_Gateway - SG_ MO_Zylabsch_Texte_02 : 16|4@1+ (1,0) [0|15] "" Sub_Gateway - SG_ MO_Fahrzeugtyp : 20|3@1+ (1,0) [0|7] "" BMS_NV,Sub_Gateway - SG_ MO_NMAX_Schaltanzeige : 23|9@1+ (25,0) [0|12775] "Unit_MinutInver" Sub_Gateway - SG_ MO_Abstellzeit : 32|8@1+ (8,0) [0|2024] "Unit_Minut" BMS_NV,Sub_Gateway,TME - SG_ MO_Abstellzeit_Status : 40|2@1+ (1,0) [0|3] "" BMS_NV,Sub_Gateway,TME - SG_ MO1_Freigabe_Verfallsinfo_WFS : 42|1@1+ (1,0) [0|1] "" Sub_Gateway - SG_ MO_Hybrid_StartStopp_LED : 43|2@1+ (1,0) [0|3] "" Sub_Gateway - SG_ MO_Fehler_Zylabsch : 45|2@1+ (1,0) [0|3] "" Sub_Gateway - SG_ MO_Anzahl_Abgesch_Zyl : 47|3@1+ (1,0) [0|7] "" Sub_Gateway - SG_ MO_Zylabsch_Texte : 50|2@1+ (1,0) [0|3] "" Sub_Gateway - SG_ MO_Ethanol_BS_Texte : 52|3@1+ (1,0) [0|7] "" Sub_Gateway - SG_ MO_Drehzahl_Warnung : 55|1@1+ (1,0) [0|1] "" Sub_Gateway - SG_ MO_obere_Drehzahlgrenze : 56|8@1+ (50,0) [50|12750] "Unit_MinutInver" Sub_Gateway - -BO_ 1710 Spiegel_01: 8 Gateway - SG_ SP_FT_oben : 0|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High - SG_ SP_FT_unten : 1|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High - SG_ SP_FT_links : 2|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High - SG_ SP_FT_rechts : 3|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High - SG_ SP_BT_oben : 4|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High - SG_ SP_BT_unten : 5|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High - SG_ SP_BT_links : 6|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High - SG_ SP_BT_rechts : 7|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High - SG_ SP_abklappen : 8|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High - SG_ SP_anklappen : 9|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High - SG_ SP_normieren : 10|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High - SG_ SP_Hzg_Taster : 12|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High - SG_ SP_S_oben : 16|1@1+ (1,0) [0|1] "" ZR_High - SG_ SP_S_unten : 17|1@1+ (1,0) [0|1] "" ZR_High - SG_ SP_S_links : 18|1@1+ (1,0) [0|1] "" ZR_High - SG_ SP_S_rechts : 19|1@1+ (1,0) [0|1] "" ZR_High - SG_ SP_Auswahl_li : 20|1@1+ (1,0) [0|1] "" ZR_High - SG_ SP_Auswahl_re : 21|1@1+ (1,0) [0|1] "" ZR_High - SG_ SP_ARA_Status : 22|1@1+ (1,0) [0|1] "" ZR_High - SG_ SP_S_Klappen : 23|1@1+ (1,0) [0|1] "" ZR_High - SG_ SP_Verstellschalter_Fehler : 24|1@1+ (1,0) [0|1] "" ZR_High - -BO_ 1711 Rear_View_01: 8 Gateway - SG_ RV_Video_on : 0|1@1+ (1,0) [0|1] "" ZR_High,ZR_Standard - SG_ RV_Dark_Screen : 1|1@1+ (1,0) [0|1] "" ZR_High,ZR_Standard - SG_ RV_HMI_Mode : 2|2@1+ (1,0) [0|3] "" ZR_High,ZR_Standard - SG_ RV_GL_side : 4|2@1+ (1,0) [0|3] "" ZR_High,ZR_Standard - SG_ RV_System_aktiv : 6|1@1+ (1,0) [0|1] "" ZR_High,ZR_Standard - SG_ RV_Reinigung_Anf : 7|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High - SG_ RV_Settings_enabled : 8|1@1+ (1,0) [0|1] "" ZR_High - SG_ RV_Menu_Item : 9|2@1+ (1,0) [0|3] "" ZR_High - SG_ SV_Video_on : 11|1@1+ (1,0) [0|1] "" ZR_High,ZR_Standard - SG_ RV_Calib_Fehler : 12|1@1+ (1,0) [0|1] "" ZR_High - SG_ RV_GL_Trailer_connect : 13|1@1+ (1,0) [0|1] "" ZR_High,ZR_Standard - SG_ RV_GL_Trunk_open : 14|1@1+ (1,0) [0|1] "" ZR_High,ZR_Standard - SG_ RV_GL_LWS_Fehler : 15|1@1+ (1,0) [0|1] "" ZR_High - SG_ RV_Helligkeit : 16|7@1+ (1,0) [0|100] "Unit_PerCent" ZR_High,ZR_Standard - SG_ ZFAS_Umfeldbeleuchtung_Anf : 23|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ RV_Kontrast : 24|7@1+ (1,0) [0|100] "Unit_PerCent" ZR_High,ZR_Standard - SG_ RV_Farbe : 32|7@1+ (1,0) [0|100] "Unit_PerCent" ZR_High,ZR_Standard - -BO_ 1714 Diagnose_01: 8 Gateway_MQB - SG_ DGN_Verlernzaehler : 0|8@1+ (1,0) [0|254] "" Airbag_MQB,BMS_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,LEH_MQB,SAK_MQB - SG_ KBI_Kilometerstand : 8|20@1+ (1,0) [0|1048573] "Unit_KiloMeter" Airbag_MQB,BMS_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,LEH_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB,SAK_MQB - SG_ UH_Jahr : 28|7@1+ (1,2000) [2000|2127] "Unit_Year" Airbag_MQB,BMS_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,LEH_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB,SAK_MQB - SG_ UH_Monat : 35|4@1+ (1,0) [1|12] "Unit_Month" Airbag_MQB,BMS_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,LEH_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB,SAK_MQB - SG_ UH_Tag : 39|5@1+ (1,0) [1|31] "Unit_Day" Airbag_MQB,BMS_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,LEH_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB,SAK_MQB - SG_ UH_Stunde : 44|5@1+ (1,0) [0|23] "Unit_Hours" Airbag_MQB,BMS_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,LEH_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB,SAK_MQB - SG_ UH_Minute : 49|6@1+ (1,0) [0|59] "Unit_Minut" Airbag_MQB,BMS_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,LEH_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB,SAK_MQB - SG_ UH_Sekunde : 55|6@1+ (1,0) [0|59] "Unit_Secon" Airbag_MQB,BMS_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,LEH_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB,SAK_MQB - SG_ Kombi_02_alt : 62|1@1+ (1,0) [0|1] "" Airbag_MQB,BMS_MQB,LEH_MQB - SG_ Uhrzeit_01_alt : 63|1@1+ (1,0) [0|1] "" Airbag_MQB,BMS_MQB,LEH_MQB - -BO_ 1716 VIN_01: 8 Gateway_MQB - SG_ VIN_01_MUX M : 0|2@1+ (1,0) [0|3] "" Airbag_MQB - SG_ KS_Geheimnis_1 m0 : 8|8@1+ (1,0) [0|255] "" Vector__XXX - SG_ KS_Geheimnis_2 m0 : 16|8@1+ (1,0) [0|255] "" Vector__XXX - SG_ KS_Geheimnis_3 m0 : 24|8@1+ (1,0) [0|255] "" Vector__XXX - SG_ KS_Geheimnis_4 m0 : 32|8@1+ (1,0) [0|255] "" Vector__XXX - SG_ VIN_1 m0 : 40|8@1+ (1,0) [0|255] "" Airbag_MQB - SG_ VIN_2 m0 : 48|8@1+ (1,0) [0|255] "" Airbag_MQB - SG_ VIN_3 m0 : 56|8@1+ (1,0) [0|255] "" Airbag_MQB - SG_ VIN_4 m1 : 8|8@1+ (1,0) [0|255] "" Airbag_MQB - SG_ VIN_5 m1 : 16|8@1+ (1,0) [0|255] "" Airbag_MQB - SG_ VIN_6 m1 : 24|8@1+ (1,0) [0|255] "" Airbag_MQB - SG_ VIN_7 m1 : 32|8@1+ (1,0) [0|255] "" Airbag_MQB - SG_ VIN_8 m1 : 40|8@1+ (1,0) [0|255] "" Airbag_MQB - SG_ VIN_9 m1 : 48|8@1+ (1,0) [0|255] "" Airbag_MQB - SG_ VIN_10 m1 : 56|8@1+ (1,0) [0|255] "" Airbag_MQB - SG_ VIN_11 m2 : 8|8@1+ (1,0) [0|255] "" Airbag_MQB - SG_ VIN_12 m2 : 16|8@1+ (1,0) [0|255] "" Airbag_MQB - SG_ VIN_13 m2 : 24|8@1+ (1,0) [0|255] "" Airbag_MQB - SG_ VIN_14 m2 : 32|8@1+ (1,0) [0|255] "" Airbag_MQB - SG_ VIN_15 m2 : 40|8@1+ (1,0) [0|255] "" Airbag_MQB - SG_ VIN_16 m2 : 48|8@1+ (1,0) [0|255] "" Airbag_MQB - SG_ VIN_17 m2 : 56|8@1+ (1,0) [0|255] "" Airbag_MQB - -BO_ 316495015 MEB_Camera_04: 32 XXX - -BO_ 316495049 SAL_01: 8 XXX - SG_ CRC : 0|8@1+ (1,0) [0|255] "" XXX - SG_ CNT : 8|4@1+ (1,0) [0|15] "" XXX - SG_ Brake_Unknown : 18|1@0+ (1,0) [0|1] "" XXX - SG_ Brake_Light_01 : 20|1@0+ (1,0) [0|1] "" XXX - SG_ NEW_SIGNAL_2 : 22|1@0+ (1,0) [0|1] "" XXX - SG_ Right_Blinker : 25|1@0+ (1,0) [0|1] "" XXX - SG_ Left_Blinker : 26|1@1+ (1,0) [0|3] "" XXX - SG_ Reverse_Light : 27|1@0+ (1,0) [0|1] "" XXX - SG_ Brake_Light_02 : 30|1@0+ (1,0) [0|1] "" XXX - SG_ Right_Blinker_02 : 44|1@1+ (1,0) [0|3] "" XXX - SG_ Left_Blinker_02 : 45|1@0+ (1,0) [0|1] "" XXX - SG_ NEW_SIGNAL_3 : 52|8@1+ (1,0) [0|15] "" XXX - SG_ NEW_SIGNAL_4 : 63|1@0+ (1,0) [0|1] "" XXX - -BO_ 316495081 MEB_Camera_05: 8 XXX - -BO_ 316495106 AAA_01: 8 XXX - SG_ CRC : 0|8@1+ (1,0) [0|255] "" XXX - SG_ CHK : 8|4@1+ (1,0) [0|15] "" XXX - -BO_ 316495140 MEB_Camera_06: 64 XXX - -BO_ 316495165 HVL_01: 8 XXX - SG_ CRC : 0|8@1+ (1,0) [0|255] "" XXX - SG_ CHK : 8|4@1+ (1,0) [0|15] "" XXX - -BO_ 380195935 IPA_02: 8 XXX - -BO_ 380196019 MEB_Camera_07: 16 XXX - -BO_ 380196036 MEB_Camera_08: 8 XXX - -BO_ 389241616 MEB_Camera_09: 8 XXX - -BO_ 389241617 MEB_Camera_10: 8 XXX - -BO_ 401604687 MEB_Camera_11: 8 XXX - -BO_ 402522959 MEB_Camera_14: 8 XXX - -BO_ 441800001 EML_02: 8 XXX - SG_ CRC : 0|8@1+ (1,0) [0|255] "" XXX - SG_ CHK : 8|4@1+ (1,0) [0|15] "" XXX - -BO_ 441800082 MEB_Camera_12: 8 XXX - -BO_ 452984911 MEB_Camera_13: 8 XXX - -CM_ BO_ 184 "Motorsteuergerät"; -CM_ BO_ 192 "Motorsteuergerät"; -CM_ BO_ 317 "Lenkungssteuergerät"; -CM_ BO_ 517 "Steuergerät für Motorstart"; -CM_ BO_ 522 "Steuergerät für Fahrzeugbewegung"; -CM_ BO_ 1622 "Steuergerät für Lenkungsverriegelung"; -CM_ BO_ 316495165 "Steuergerät ICAS1"; -CM_ BO_ 441800001 "Steuergerät für Fahrzeugbewegung"; -VAL_ 64 AB_RGS_Anst 4 "aktiv_Niveau_1" 5 "aktiv_Niveau_2" 6 "aktiv_Niveau_3" 7 "aktiv_Niveau_4" 8 "deaktiviert"; -VAL_ 64 AB_Front_Crash 0 "kein_Front_Crash" 1 "Front_Crash"; -VAL_ 64 AB_Heck_Crash 0 "kein_Heck_Crash" 1 "Heck_Crash"; -VAL_ 64 AB_SF_Crash 0 "kein_Seiten_Crash_Fahrer" 1 "Seiten_Crash_Fahrer"; -VAL_ 64 AB_SB_Crash 0 "kein_Seiten_Crash_Beifahrer" 1 "Seiten_Crash_Beifahrer"; -VAL_ 64 AB_Rollover_Crash 0 "kein_Rollover" 1 "Rollover"; -VAL_ 64 AB_Crash_Int 0 "kein_Crash" 1 "Crash_Intensitaet_1" 2 "Crash_Intensitaet_2_(nur_Stellgliedtest_MLB_B8)" 3 "Crash_Intensitaet_2_(nur_D4_C7_Colorado_NF_PAG__Crash_im_MLB_B8)" 4 "Crash_Intensitaet_3_(alt_VW/AUDI__Stellgliedtest_MLB_B8)" 5 "Crash_Intensitaet_3_(alt_PAG)" 7 "Crash_Intensitaet_3"; -VAL_ 64 AB_Lampe 0 "Aus" 1 "Ein"; -VAL_ 64 AB_Deaktiviert 0 "aktiv" 1 "deaktiviert"; -VAL_ 64 AB_VB_deaktiviert 0 "Beifahrerairbag_aktiv" 1 "Beifahrerairbag_deaktiviert"; -VAL_ 64 AB_Systemfehler 0 "kein_Fehler" 1 "Airbag_Systemfehler"; -VAL_ 64 AB_Diagnose 0 "nicht_in_Diagnose" 1 "in_Diagnose"; -VAL_ 64 AB_Stellgliedtest 0 "nicht_im_Stellgliedtest" 1 "Airbag_im_Stellgliedtest"; -VAL_ 64 AB_Erh_Auf_VB 0 "keine_Anzeige" 1 "Beifahrerairbag_deaktiviert" 2 "Beifahrerairbag_aktiviert" 3 "nicht_definiert"; -VAL_ 64 AB_Gurtwarn_VF 0 "keine_Warnung" 1 "Gurtwarnung_ausloesen"; -VAL_ 64 AB_Gurtwarn_VB 0 "keine_Warnung" 1 "Gurtwarnung_ausloesen"; -VAL_ 64 AB_Anzeige_Fussg 0 "keine_FSG_Aktion_ausgeloest" 1 "Motorhaube_offen" 2 "Systemfehler"; -VAL_ 64 AB_Texte_AKS 0 "keine_AKS_Ausloesung" 1 "AKS_ausgeloest" 2 "AKS_Systemfehler"; -VAL_ 64 AB_MKB_gueltig 0 "Multikollisionsbremsung_nicht_freigeschaltet" 1 "Multikollisionsbremsung_freigeschaltet"; -VAL_ 64 AB_MKB_Anforderung 0 "Multikollisionsbremsung_nicht_angefordert" 1 "Multikollisionsbremsung_angefordert"; -VAL_ 64 AB_Versorgungsspannung 0 "plausibel" 1 "unplausibel"; -VAL_ 64 AB_Deaktivierung_HV 0 "keine_Deaktivierung" 1 "Deaktivierung_1" 2 "Deaktivierung_2" 3 "Deaktivierung_3" 4 "Deaktivierung_4" 5 "Deaktivierung_5" 6 "Deaktivierung_6" 7 "Fehler"; -VAL_ 64 AB_EDR_Trigger 0 "No_Event" 1 "Start_Event" 2 "NonDeployment_Event" 3 "Deployment_Event"; -VAL_ 64 AB_Belegung_VF 0 "nicht_verfuegbar" 1 "Fehler" 2 "nicht_belegt" 3 "belegt"; -VAL_ 64 SC_LowSpeedCrashErkannt 0 "kein_Crash_erkannt" 1 "Crash_Frontbereich_erkannt" 2 "Crash_Heckbereich_erkannt" 3 "Crash_Front_und_Heckbereich_erkannt"; -VAL_ 64 SC_Masterzeit 127 "Init"; -VAL_ 134 LWI_Sensorstatus 0 "iO" 1 "nicht kalibriert"; -VAL_ 134 LWI_QBit_Sub_Daten 0 "LWS-Subinfo real (Lenkradwinkelinformation ADS-tauglich)" 1 "LWS-Subinfo simuliert (Lenkradwinkelinformation nicht ADS-tauglich )"; -VAL_ 134 LWI_MFL_Abschaltung 0 "inaktiv" 1 "aktiv"; -VAL_ 134 LWI_QBit_Lenkradwinkel 0 "gültiger Wert" 1 "ausserhalb der Spezifikation"; -VAL_ 134 LWI_Lenkradwinkel 8190 "Init" 8191 "Fehler"; -VAL_ 134 LWI_VZ_Lenkradwinkel 0 "positiv_links_von_der_Nullstellung" 1 "negativ"; -VAL_ 134 LWI_VZ_Lenkradw_Geschw 0 "positiv_links_von_der_Nullstellung" 1 "negativ"; -VAL_ 134 LWI_Lenkradw_Geschw 510 "Init" 511 "Fehler"; -VAL_ 159 EPS_HCA_Status 0 "disabled" 1 "initializing" 2 "fault" 3 "ready" 4 "rejected" 5 "active" 8 "preempted"; -VAL_ 167 MO_Mom_Soll_Roh 1022 "Init"; -VAL_ 167 MO_Mom_Ist_Summe 1022 "Init"; -VAL_ 167 MO_Mom_Traegheit_Summe 1022 "Init"; -VAL_ 167 MO_Mom_Soll_gefiltert 1022 "Init"; -VAL_ 167 MO_Mom_Schub 510 "Init"; -VAL_ 167 MO_Status_Normalbetrieb_01 0 "kein_Normalbetrieb" 1 "Normalbetrieb_erreicht"; -VAL_ 167 MO_erste_Ungenauschwelle 0 "genau" 1 "Momente ungenauer >8%"; -VAL_ 167 MO_QBit_Motormomente 0 "gueltiger_Wert" 1 "Ersatz_Init_oder_Fehlerwert"; -VAL_ 168 MO_Mom_neg_verfuegbar 510 "Init" 511 "Fehler"; -VAL_ 168 MO_Mom_Begr_stat 510 "Init"; -VAL_ 168 MO_Mom_Begr_dyn 1022 "Init"; -VAL_ 168 MO_QBit_Drehzahl_01 0 "gueltiger_Wert" 1 "Ersatz_Init_oder_Fehlerwert"; -VAL_ 173 GE_MMom_Soll_02 1022 "keine_Anforderung_Init" 1023 "Fehler"; -VAL_ 173 GE_MMom_Vorhalt_02 1022 "Init" 1023 "Fehler"; -VAL_ 173 GE_Uefkt 1023 "Fehler"; -VAL_ 173 GE_Fahrstufe 0 "Zwischenstellung" 1 "Init" 5 "P" 6 "R" 7 "N" 8 "D" 9 "D" 10 "E" 13 "T" 14 "T" 15 "Fehler"; -VAL_ 173 GE_Schaltablauf 0 "keine_Schaltung" 1 "Momentenueberschneidung" 2 "Befuellphase" 3 "Drehzahlueberfuehrung"; -VAL_ 173 GE_Uefkt_unplausibel 0 "Uefkt_plausibel" 1 "Uefkt_unplausibel"; -VAL_ 173 GE_MMom_Status_02 0 "kein_Eingriff" 1 "abs_reduzierender_Eingriff_auf_Gesamt_Antrieb_nur_schneller_Pfad" 2 "abs_erhoehender_Eingriff_auf_Gesamt_Antrieb" 3 "relativer_Eingriff_auf_Gesamt_Antrieb" 4 "relativer_Eingriff_auf_E_Maschine" 5 "abs_red_Eingr_auf_Gesamt_Antrieb_nur_Luftpfad" 6 "abs_red_Eingr_auf_Gesamt_Antrieb_Luft-_und_schnellen_Pfad" 7 "abs_Eingriff_auf_Gesamtantrieb_erhoehend_und_reduzierend"; -VAL_ 173 GE_Status_Kraftschluss 0 "offen_kein_Kraftschluss" 1 "offen_mit_Kraftschluss" 2 "schlupfend_geregelt" 3 "abgesichert_offen_kein_Kraftschl" 4 "geschlossen_mit_Mikroschlupf" 5 "geschlossen_mit_Ueberanpressung" 6 "sonstige_Fehler" 7 "fehlerhaft_geschlossen"; -VAL_ 173 GE_MMom_Status 0 "keine Anforderung" 1 "reduzierender Getriebeeingriff" 2 "erhöhender Getriebeeingriff" 3 "Įderung mit Sprung"; -VAL_ 173 GE_Freig_MMom_Vorhalt 0 "nicht_freigegeben" 1 "freigegeben"; -VAL_ 173 GE_Verbot_Ausblendung 0 "kein_Verbot" 1 "Verbot"; -VAL_ 173 GE_Zielgang 0 "Gang P/N (ausgekuppelt)" 1 "Gang 1" 2 "Gang 2" 3 "Gang 3" 4 "Gang 4" 5 "Gang 5" 6 "Gang 6" 7 "Gang 7" 8 "Gang R" 11 "Gang 8" 12 "Gang 9" 13 "Gang10" 14 "Istgang nicht definiert" 15 "Fehler"; -VAL_ 184 EM1_Freigabe_Info_WFS 0 "ungueltig" 1 "gueltig"; -VAL_ 184 EM1_Sperr_Info_WFS 0 "nicht_gesperrt" 1 "gesperrt"; -VAL_ 184 EM1_AR_aktiv 0 "Init" 1 "Ruckeldaempfer_aktiv"; -VAL_ 184 EM1_Eta_Sys 510 "Init" 511 "Fehler"; -VAL_ 184 EM1_IstStrom 2046 "Init" 2047 "Fehler"; -VAL_ 184 EM1_Fehler_ElAntriebFreilauf_Anf 0 "Init" 1 "Fehler_EM_im_Freilauf"; -VAL_ 184 EM1_Abregelung_Temperatur 0 "Init" 1 "Abregelung_Temperatur"; -VAL_ 184 EM1_AnlernenElMotor_Anf 0 "kein_Diagnose_Request" 1 "Diagnose_Request"; -VAL_ 184 EM1_Moment_HVVerbraucher 1023 "Init"; -VAL_ 184 EM1_Freigabe_Verfallsinfo_WFS 0 "Aus" 1 "Ein"; -VAL_ 184 EM1_Parken_WFS_Status 0 "Limitierung_Inaktiv" 1 "Limitierung_Aktiv" 2 "Abbruch"; -VAL_ 184 EM1_HV_betriebsbereit 0 "Init" 1 "Ready_HV"; -VAL_ 190 Engine_Status 1 "Ready" 2 "Online"; -VAL_ 253 BR_Eingriffsmoment 1022 "Init" 1023 "Fehler"; -VAL_ 253 ESP_Diagnose 0 "ESP_nicht_in_Diagnose" 1 "ESP_in_Diagnose"; -VAL_ 253 ESC_v_Signal_Qualifier_High_Low 0 "Gueteschwelle_kleiner_1kmh" 1 "Gueteschwelle_kleiner_3kmh" 2 "Gueteschwelle_kleiner_5kmh" 3 "Gueteschwelle_kleiner_10kmh" 4 "Gueteschwelle_kleiner_20kmh" 5 "Gueteschwelle_groessergleich_20kmh" 6 "Init" 7 "Fehler"; -VAL_ 253 ESP_Vorsteuerung 0 "keine_Vorsteuerung_aktiv" 1 "Vorsteuerung_aktiv"; -VAL_ 253 OBD_Schlechtweg 0 "kein_Schlechtweg_erkannt" 1 "Schlechtweg_erkannt"; -VAL_ 253 OBD_QBit_Schlechtweg 0 "gueltiger_Wert" 1 "Ersatz_Init_oder_Fehlerwert"; -VAL_ 253 ESP_v_Signal 65533 "Unterspannung" 65534 "Init" 65535 "Fehler"; -VAL_ 253 ASR_Tastung_passiv 0 "ASR_aktiviert" 1 "ASR_passiv_getastet_oder_Schwellen_geaendert"; -VAL_ 253 ESP_Tastung_passiv 0 "ESP_aktiviert" 1 "ESP_passiv_getastet_oder_Schwellen_geaendert"; -VAL_ 253 ESP_Systemstatus 0 "iO" 1 "Fehler"; -VAL_ 253 ASR_Schalteingriff 0 "keine_Anforderung" 1 "ASR_Schaltkennfeld" 2 "Rueckschaltung" 3 "Schaltverbot"; -VAL_ 253 ESP_QBit_v_Signal 0 "gueltiger_Wert" 1 "Ersatz_Init_oder_Fehlerwert"; -VAL_ 253 ABS_Bremsung 0 "keine_ABS_Regelung" 1 "ABS_Regelung_aktiv"; -VAL_ 253 ASR_Anf 0 "keine_Anforderung" 1 "ASR_Anforderung"; -VAL_ 253 MSR_Anf 0 "keine Anfoderung" 1 "MSR-Anforderung"; -VAL_ 253 EBV_Eingriff 0 "kein_EBV_Eingriff" 1 "EBV_Eingriff"; -VAL_ 253 EDS_Eingriff 0 "kein_EDS_Eingriff" 1 "EDS_Eingriff"; -VAL_ 253 ESP_Eingriff 0 "kein_ESP_Eingriff" 1 "ESP_Eingriff_aktiv"; -VAL_ 253 ESP_ASP 0 "inaktiv" 1 "aktiv"; -VAL_ 253 ESC_Neutralschaltung 0 "keine_Anforderung" 1 "Neutralschaltung_angefordert"; -VAL_ 267 TSK_Status 0 "init" 1 "disabled" 2 "enabled" 3 "regulating" 4 "accel_pedal_override" 5 "brake_only" 6 "temp_fault" 7 "perm_fault"; -VAL_ 278 ESP_QBit_Wegimpuls_VL 0 "gueltiger_Wert" 1 "Ersatz_Init_oder_Fehlerwert"; -VAL_ 278 ESP_QBit_Wegimpuls_VR 0 "gueltiger_Wert" 1 "Ersatz_Init_oder_Fehlerwert"; -VAL_ 278 ESP_QBit_Wegimpuls_HL 0 "gueltiger_Wert" 1 "Ersatz_Init_oder_Fehlerwert"; -VAL_ 278 ESP_QBit_Wegimpuls_HR 0 "gueltiger_Wert" 1 "Ersatz_Init_oder_Fehlerwert"; -VAL_ 278 ESP_Wegimpuls_VL 1021 "Init" 1022 "Unterspannung" 1023 "Fehler"; -VAL_ 278 ESP_Wegimpuls_VR 1021 "Init" 1022 "Unterspannung" 1023 "Fehler"; -VAL_ 278 ESP_Wegimpuls_HL 1021 "Init" 1022 "Unterspannung" 1023 "Fehler"; -VAL_ 278 ESP_Wegimpuls_HR 1021 "Init" 1022 "Unterspannung" 1023 "Fehler"; -VAL_ 278 ESP_VL_Fahrtrichtung 0 "Vorwaerts" 1 "Rueckwaerts" 2 "Init" 3 "ungueltig_oder_nicht_verbaut"; -VAL_ 278 ESP_VR_Fahrtrichtung 0 "Vorwaerts" 1 "Rueckwaerts" 2 "Init" 3 "ungueltig_oder_nicht_verbaut"; -VAL_ 278 ESP_HL_Fahrtrichtung 0 "Vorwaerts" 1 "Rueckwaerts" 2 "Init" 3 "ungueltig_oder_nicht_verbaut"; -VAL_ 278 ESP_HR_Fahrtrichtung 0 "Vorwaerts" 1 "Rueckwaerts" 2 "Init" 3 "ungueltig_oder_nicht_verbaut"; -VAL_ 299 GRA_Hauptschalter 0 "Hauptschalter_aus__Taster_nicht_betaetigt" 1 "Hauptschalter_ein__Taster_betaetigt"; -VAL_ 299 GRA_Abbrechen 0 "nicht_betaetigt" 1 "betaetigt"; -VAL_ 299 GRA_Typ_Hauptschalter 0 "gerasteter_Lenkstockschalter" 1 "getasteter_Lenkstockschalter"; -VAL_ 299 GRA_Limiter 0 "nicht_betaetigt" 1 "betaetigt"; -VAL_ 299 GRA_Tip_Setzen 0 "nicht_betaetigt" 1 "betaetigt"; -VAL_ 299 GRA_Tip_Hoch 0 "nicht_betaetigt" 1 "betaetigt"; -VAL_ 299 GRA_Tip_Runter 0 "nicht_betaetigt" 1 "betaetigt"; -VAL_ 299 GRA_Tip_Wiederaufnahme 0 "nicht_betaetigt" 1 "betaetigt"; -VAL_ 299 GRA_Verstellung_Zeitluecke 0 "Taste_nicht_betaetigt" 1 "Dist_minus_1" 2 "Dist_plus_1" 3 "Dist_Toggle"; -VAL_ 299 GRA_Codierung 0 "kein_Hebel" 1 "GRA_Hebel" 2 "ACC_Hebel" 3 "Limiter_Only"; -VAL_ 299 GRA_Fehler 0 "kein_Fehler" 1 "Fehler"; -VAL_ 299 GRA_LIM_Taste_verfuegbar 0 "Limiter_Taste_nicht_vorhanden" 1 "Limiter_Taste_vorhanden"; -VAL_ 299 GRA_Tip_Stufe_2 0 "Tip_Stufe_1__keine_Betaetigung" 1 "Tip_Stufe_2"; -VAL_ 299 GRA_TravelAssist 0 "nicht_betaetigt" 1 "betaetigt"; -VAL_ 317 LatCon_HCA_Status 0 "disabled" 1 "initializing" 2 "ready" 3 "fault" 4 "active" 5 "preempted" 6 "fault" 7 "rejected"; -VAL_ 319 PreCrash_Charisma_FahrPr 0 "keine_Funktion" 1 "Programm_1" 2 "Programm_2" 3 "Programm_3" 4 "Programm_4" 5 "Programm_5" 6 "Programm_6" 7 "Programm_7" 8 "Programm_8" 9 "Programm_9" 10 "Programm_10" 11 "Programm_11" 12 "Programm_12" 13 "Programm_13" 14 "Programm_14" 15 "Programm_15"; -VAL_ 319 PreCrash_Charisma_Status 0 "Init" 1 "verfuegbar" 2 "nicht_verfuegbar" 3 "asynchron_durch_Fahrerwunsch"; -VAL_ 319 PreCrash_Schiebedach_schliessen 0 "keine_Schliessung" 1 "Schliessung_angefordert"; -VAL_ 319 PreCrash_Fenster_schliessen 0 "keine_Schliessung" 1 "Schliessung_angefordert"; -VAL_ 319 PreCrash_Blinken 0 "keine_Blinkanforderung" 1 "Warnblinken" 2 "RECAS_Blinken" 3 "Notbremsblinken"; -VAL_ 319 SC_PreSense_FCWP 0 "Warnung_gilt_fuer_Objekte" 1 "Warnung_gitl_fuer_Fussgaenger"; -VAL_ 319 PreCrash_Tueren_Verriegeln 0 "keine_Anforderung" 1 "Tueren_Verriegeln"; -VAL_ 319 PreCrash_Anforderung_AFR 0 "keine_Anforderung" 1 "linke_Seite" 2 "rechte_Seite" 3 "Vorderachse" 4 "Hinterachse" 5 "Vorwarnung" 7 "Init"; -VAL_ 319 SC_PreCrash_LED 0 "keine_Anzeige" 1 "Stufe_1_glimmen" 2 "Stufe_2_leuchten" 3 "Stufe_3_blinken"; -VAL_ 319 PreCrash_FS_Pneumatik_ansteuern 0 "keine_Anforderung" 1 "Pneumatik_ansteuern"; -VAL_ 319 PreCrash_BFS_Pneumatik_ansteuern 0 "keine_Anforderung" 1 "Pneumatik_ansteuern"; -VAL_ 319 PreCrash_Fo_Pneumatik_ansteuern 0 "keine_Anforderung" 1 "Pneumatik_ansteuern"; -VAL_ 319 PreCrash_FS_Sitzlehne_verfahren 0 "keine_Anforderung" 1 "Sitzlehne_in_pos_x-Richtung_verfahren(vor)" 2 "Sitzlehne_in_neg_x-Richtung_verfahren(zurueck)" 3 "Sitzlehnenkopf_in_pos_x-Richtung_verfahren(vor)" 4 "Sitzlehnenkopf_in_neg_x-Richtung_verfahren(zurueck)" 6 "Lehnenverstellung_ansteuern" 7 "Lehnenkopfverstellung_ansteuern"; -VAL_ 319 PreCrash_BFS_Sitzlehne_verfahren 0 "keine_Anforderung" 1 "Sitzlehne_in_pos_x-Richtung_verfahren(vor)" 2 "Sitzlehne_in_neg_x-Richtung_verfahren(zurueck)" 3 "Sitzlehnenkopf_in_pos_x-Richtung_verfahren(vor)" 4 "Sitzlehnenkopf_in_neg_x-Richtung_verfahren(zurueck)" 6 "Lehnenverstellung_ansteuern" 7 "Lehnenkopfverstellung_ansteuern"; -VAL_ 319 PreCrash_Fo_Sitzlehne_verfahren 0 "keine_Anforderung" 1 "Sitzlehne_in_pos_x-Richtung_verfahren(vor)" 2 "Sitzlehne_in_neg_x-Richtung_verfahren(zurueck)" 3 "Sitzlehnenkopf_in_pos_x-Richtung_verfahren(vor)" 4 "Sitzlehnenkopf_in_neg_x-Richtung_verfahren(zurueck)"; -VAL_ 319 PreCrash_FS_KSV_verfahren 0 "keine_Anforderung" 1 "in_pos_x-Richtung_verfahren" 2 "in_neg_x-Richung_verfahren" 3 "in_pos_z-Richtung_verfahren" 4 "in_neg_z-Richtung_verfahren" 5 "in_pos_x-Richtung_und_neg_z-Richtung_verfahren" 6 "in_pos_x_Richtung_und_pos_z-Richtung_verfahren" 7 "in_neg_x-Richtung_und_neg_z-Richtung_verfahren" 8 "in_neg_x-Richtung_und_pos_z-Richtung_verfahren" 9 "Kopfstuetze_ansteuern"; -VAL_ 319 PreCrash_BFS_KSV_verfahren 0 "keine_Anforderung" 1 "in_pos_x-Richtung_verfahren" 2 "in_neg_x-Richung_verfahren" 3 "in_pos_z-Richtung_verfahren" 4 "in_neg_z-Richtung_verfahren" 5 "in_pos_x-Richtung_und_neg_z-Richtung_verfahren" 6 "in_pos_x_Richtung_und_pos_z-Richtung_verfahren" 7 "in_neg_x-Richtung_und_neg_z-Richtung_verfahren" 8 "in_neg_x-Richtung_und_pos_z-Richtung_verfahren" 9 "Kopfstuetze_ansteuern"; -VAL_ 319 PreCrash_Fo_KSV_verfahren 0 "keine_Anforderung" 1 "in_pos_x-Richtung_verfahren" 2 "in_neg_x-Richung_verfahren" 3 "in_pos_z-Richtung_verfahren" 4 "in_neg_z-Richtung_verfahren" 5 "in_pos_x-Richtung_und_neg_z-Richtung_verfahren" 6 "in_pos_x_Richtung_und_pos_z-Richtung_verfahren" 7 "in_neg_x-Richtung_und_neg_z-Richtung_verfahren" 8 "in_neg_x-Richtung_und_pos_z-Richtung_verfahren"; -VAL_ 319 SC_PreCrash_Warnung 0 "keine_Anzeige" 1 "latente_Vorwarnung" 2 "Vorwarnung" 3 "Akutwarnung" 4 "Eingriff" 5 "Fahreruebernahmeaufforderung" 6 "Abbiegewarnung" 7 "Basiseingriff" 8 "Heckeingriff"; -VAL_ 319 SC_PreCrash_Texte 0 "keine_Anzeige" 1 "Systemstoerung" 2 "keine_Sensorsicht" 3 "Demomodus" 4 "System_aus" 5 "Anhaengerbetrieb" 6 "ESC_aus" 7 "zurzeit_eingeschraenkt" 8 "zurzeit_eingeschraenkt_ESP_Aus" 9 "Initialisierung"; -VAL_ 333 ACC_limitierte_Anfahrdyn 0 "keine_Limitierung" 1 "Limitierung_Anfahrdynamik_angefordert"; -VAL_ 333 ACC_nachtr_Stopp_Anf 0 "nicht_angefordert" 1 "angefordert"; -VAL_ 333 ACC_StartStopp_Info 0 "Motorlauf_langfristig_nicht_notwendig_Stoppfreigabe" 1 "Motoranlauf_nicht_zwingend_notwendig_Stoppverbot_keine_Startanforderung" 2 "Motoranlauf_zwingend_notwendig_Startanforderung" 3 "Systemfehler"; -VAL_ 333 ACC_Sollbeschleunigung_02 2046 "Neutralwert" 2047 "Fehler"; -VAL_ 333 ACC_Anfahren 0 "keine_Anforderung_Anfahren" 1 "Anforderung_Anfahren"; -VAL_ 333 ACC_Anhalten 0 "kein_Anhalten_gewuenscht" 1 "Anhalten_gewuenscht"; -VAL_ 333 ACC_Typ 0 "Basis_ACC" 1 "ACC_mit_FollowToStop" 2 "ACC_mit_StopAndGo" 3 "ACC_nicht_codiert"; -VAL_ 333 ACC_Status_ACC 0 "ACC_OFF_Hauptschalter_aus" 1 "ACC_INIT" 2 "ACC_STANDBY" 3 "ACC_AKTIV_regelt" 4 "ACC_OVERRIDE" 5 "ACC_Abschaltreaktion" 6 "reversibler_Fehler_im_ACC_System" 7 "irreversibler_Fehler_im_ACC_System"; -VAL_ 333 ACC_Minimale_Bremsung 0 "Anforderung_Minimale_Bremsung_nicht_aktiv" 1 "Anforderung_Minimale_Bremsung_aktiv"; -VAL_ 333 ACC_Anhalteweg 2046 "Neutralwert" 2047 "Fehler"; -VAL_ 333 ACC_Anforderung_HMS 0 "keine_Anforderung" 1 "halten" 2 "parken" 3 "halten_Standby" 4 "anfahren" 5 "Loesen_ueber_Rampe"; -VAL_ 333 Accel_Boost 3 "Driving" 0 "Stop" 2 "Driving" 1 "Driving"; -VAL_ 339 MO_HVEM_Eskalation 0 "keine_Eskalation_HVEM" 1 "Eskalation_HVEM"; -VAL_ 339 MO_ErwGrenzen_Anf 0 "normal" 1 "erweitert"; -VAL_ 339 MO_Fehler_Notentladung_Anf 0 "Init"; -VAL_ 339 MO_HVEM_MaxLeistung 510 "Init"; -VAL_ 339 MO_HVK_EmIstzustand 0 "HvOff" 1 "HvStbyReq" 2 "HvStbyOk" 3 "HvBattOnReq" 4 "HvBattOnOk" 10 "HvOnIdle" 18 "HvOnDrvReq" 19 "HvOnDrvOk" 20 "HvOnDrvRdy" 28 "HvStepUpReq" 29 "HvStepUpOk" 30 "HvStepUp" 38 "HvStepDownReq" 39 "HvStepDownOk" 40 "HvStepDown" 46 "HvAcChPreReq" 47 "HvAcChPreOk" 48 "HvAcChReq" 49 "HvAcChOk" 50 "HvAcCh" 56 "HvDcChPreReq" 57 "HvDcChPreOk" 58 "HvDcChReq" 59 "HvDcChOk" 60 "HvDcCh" 67 "HvChOffReq" 68 "HvChOffOk" 69 "HvOnIdleReq" 70 "HvOnIdleOk" 96 "HvCpntOffReq" 97 "HvCpntOffOk" 98 "HvBattOffReq" 99 "HvBattOffOk" 109 "HvDcDcFailOffReq" 110 "HvDcDcFail" 119 "HvElmOffReq" 120 "HvElmOff" 126 "HvFailCpntOffReq" 127 "HvFailCpntOffOk" 128 "HvFailBattOffReq" 129 "HvFailBattOffOk" 130 "HvFailBattOff" 138 "HvFailUCtlReq" 139 "HvFailUCtlOk" 140 "HvFailUCtl" 150 "HvEmgcyOff" 255 "Init"; -VAL_ 339 MO_HVK_AntriebFehlerstatus 0 "Komponente_IO" 6 "Keine_Komponentenfunktion" 7 "Init"; -VAL_ 339 MO_MVK_Bordnetz_Anf 0 "keine_Anforderung" 1 "Bordnetzaktivitaet_gefordert"; -VAL_ 339 MO_HVK_AntriebZustand 0 "Antrieb_AUS" 1 "Antrieb_Startphase" 2 "E_Fahren" 3 "Hybrid_Fahren" 7 "Init"; -VAL_ 339 MO_HVK_EmFehlerstatus 0 "Komponente_IO" 1 "Eingeschr_KompFkt_Teilbetrieb" 3 "Eingeschr_KompFkt_Interlock" 6 "Keine_Komponentenfunktion" 7 "Init"; -VAL_ 339 MO_MVK_AntriebFehlerstatus 0 "Komponente_IO" 6 "Keine_Komponentenfunktion" 7 "Init"; -VAL_ 339 MO_MVK_AntriebZustand 0 "Antrieb_AUS" 1 "Antrieb_Startphase" 2 "FreilaufMotorAus" 7 "Init"; -VAL_ 339 MO_MVK_EmFehlerstatus 0 "Komponente_IO" 1 "Eingeschr_KompFkt_Teilbetrieb" 6 "Keine_Komponentenfunktion" 7 "Init"; -VAL_ 339 MO_MVK_EmIstzustand 0 "MvOff" 1 "MvStbyReq" 2 "MvStbyOk" 3 "MvBattOnReq" 4 "MvBattOnOk" 10 "MvOnIdle" 18 "MvOnDrvReq" 19 "MvOnDrvOk" 20 "MvOnDrv" 28 "MvStepUpReq" 29 "MvStepUpOk" 30 "MvStepUp" 38 "MvStepDownReq" 39 "MvStepDownOk" 40 "MvStepDown" 96 "MvCpntOffReq" 97 "MvCpntOffOk" 98 "MvBattOffReq" 99 "MvBattOffOk" 109 "MvDcDcFailOffReq" 110 "MvDcDcFail" 119 "MvElmFailOffReq" 120 "MvElmFail" 126 "MvFailCpntOffReq" 127 "MvFailCpntOffOk" 128 "MvFailBattOffReq" 129 "MvFailBattOffOk" 130 "MvFailBattOff" 138 "MvFailUCtlReq" 139 "MvFailUCtlOk" 140 "MvFailUCtl" 150 "MvEmgcyOff" 255 "Init"; -VAL_ 420 EA_Parken_beibehalten_HMS 0 "Parken_nicht_beibehalten" 1 "Parken_beibehalten" 2 "Init" 3 "Fehler"; -VAL_ 420 EA_Warnruckprofil 0 "keine_Ruckanforderung" 1 "Profil_1" 2 "Profil_2" 3 "Profil_3" 4 "Profil_4" 5 "Profil_5" 6 "Profil_6" 7 "Profil_7"; -VAL_ 420 EA_eCall_Anf 0 "Keine_Anforderung" 1 "Ausloesen_eCall"; -VAL_ 420 EA_Funktionsstatus 0 "EA_INIT" 1 "EA_OFF" 2 "EA_STANDBY" 3 "EA_PHASE0_AKTIV" 4 "EA_PHASE1_AKTIV" 5 "EA_PHASE2_AKTIV" 6 "EA_PHASE3_AKTIV" 7 "EA_REVERSIBLER_FEHLER" 8 "EA_IRREVERSIBLER_FEHLER"; -VAL_ 420 EA_Gurtstraffer_Anf 0 "Keine_Anforderung" 1 "Haptik_1" 2 "Haptik_2" 3 "Haptik_3"; -VAL_ 420 EA_Anforderung_HMS 0 "keine_Anforderung" 1 "halten" 2 "parken" 3 "halten_Standby" 4 "anfahren" 5 "Loesen_ueber_Rampe" 6 "Parken_mit_P"; -VAL_ 420 EA_Sollbeschleunigung 2046 "Neutralwert" 2047 "Fehler"; -VAL_ 496 EA_Texte 0 "keine_Anzeige" 1 "Nothalteassistent_fehlende_Fahreraktivitaet" 2 "Nothalteassistent_aktiv_Fahrzeugfuehrung_uebernehmen" 3 "Nothalteassistent_automatischer_Nothalt_wird_durchgefuehrt" 4 "Nothalteassistent_automatischer_Nothalt_durchgefuehrt" 5 "Nothalteassistent_Verbindung_zum_Notruf_wird_aufgebaut" 6 "Nothalteassistent_deaktiviert" 7 "Nothalteassistent_Eingriff_abgebrochen" 8 "Nothalteassistent_fehlende_Fahreraktivitaet_2" 9 "Sekundenschlaf_erkannt" 10 "LaneAssist_Lenkung_uebernehmen" 11 "ACA_Fahrzeugfuehrung_uebernehmen" 12 "EA_Fahr_Standstreifenwechsel" 14 "Nothalteassistent_nicht_verfuegbar_reversibel" 15 "Nothalteassistent_Stoerung_irreversibel"; -VAL_ 496 ACF_Lampe_Hands_Off 0 "keine_Anzeige" 1 "Hands_Off_erkannt"; -VAL_ 496 EA_Infotainment_Anf 0 "Init" 1 "Keine_Absenkung" 2 "Absenkung" 3 "Mute"; -VAL_ 496 EA_Tueren_Anf 0 "Keine_Anforderung" 1 "Tueren_entriegeln"; -VAL_ 496 EA_Innenraumlicht_Anf 0 "Innenraumbeleuchtung_ausschalten" 1 "Innenraumbeleuchtung_einschalten"; -VAL_ 496 zFAS_Warnblinken 0 "Aus" 1 "Statisch" 2 "Taster" 3 "Statisch_ohne_WBT"; -VAL_ 496 STP_Primaeranz 0 "keine_Anzeige" 1 "Verfuegbar" 2 "Aktiv" 3 "Uebernahme" 4 "Aktiv_Warnung" 5 "Nicht_Verfuegbar"; -VAL_ 496 EA_Bremslichtblinken 0 "kein_Blinken" 1 "Anforderung_Bremslichtblinken"; -VAL_ 496 EA_Blinken 0 "Kein_Blinken" 1 "Wechselblinken_links" 2 "Wechselblinken_rechts" 3 "Warnblinken" 4 "Warnblinken_Taster"; -VAL_ 591 Distance_Status 0 "Valid" 3 "Invalid"; -VAL_ 619 Travel_Assist_Status 4 "enabled" 0 "disabled" 2 "ready" 3 "pre_ready"; -VAL_ 619 Travel_Assist_Request 4 "enable" 3 "disable" 0 "no_request" 1 "error"; -VAL_ 619 Travel_Assist_Available 0 "not_available" 1 "available"; -VAL_ 706 MO_Anzeige_StSt_Text 0 "keine_Anzeige" 1 "Systemfehler" 2 "Motor_manuell_starten" 3 "Rueckmeldung_durch_Fahrstufe_einlegen" 4 "Zuendungsabschaltwarnung_Timerstart" 5 "Zum_Motorstart_Bremse_treten" 6 "StSt_Aktivierung_nicht_moeglich_auf_Grund_Fahrprogramm"; -VAL_ 706 MO_Anzeige_StSt_Symbol 0 "keine_Anzeige" 1 "StSt_aktiv" 2 "Motorlauf_noetig" 3 "Fahrer_temporaer_abwesend" 4 "Fahrer_vielleicht_anwesend"; -VAL_ 706 MO_ADR_Status 0 "nicht_aktiv" 1 "ADR_angefordert" 2 "ADR_aktiv" 3 "ADR_Fehler"; -VAL_ 706 MO_AGA_Sound_Texte 0 "keine_Anzeige" 1 "Sound_off" 2 "Sound_on"; -VAL_ 706 MO_Anzeige_FMAus_Text 0 "keine_Anzeige" 1 "FMAus_Systemfehler"; -VAL_ 706 MO_Fehler_MSpG 0 "i.O." 1 "Gebl䳥 defekt oder Motorraumtemp. zu hoch"; -VAL_ 706 PEA_Texte 0 "Keine_Anzeige" 1 "PEA_Fahreruebernahme_noetig" 2 "PEA_Reku_nicht_verfuegbar"; -VAL_ 706 TSK_Ueberstimmt_vMax_FahrerInfo 0 "nicht_ueberstimmbar" 1 "ueberstimmbar" 2 "ueberstimmt"; -VAL_ 706 MO_Avus_Motorschutz 0 "keine Warnung" 1 "Drehzahlwarnung Stufe 1" 2 "Drehzahlwarnung Stufe 2" 3 "Drehzahlwarnung Stufe 3"; -VAL_ 706 MO_Rekuperationsstufe 0 "keine_Anzeige" 1 "Rekuperationsstufe_1" 2 "Rekuperationsstufe_2" 3 "Rekuperationsstufe_3" 4 "Rekuperationsstufe_4" 5 "Rekuperationsstufe_5" 6 "Rekuperationsstufe_auto" 7 "Init"; -VAL_ 706 TSK_Einheit_vMax_FahrerInfo 0 "km_h" 1 "mph"; -VAL_ 706 TSK_Status_vMax_FahrerInfo 0 "keine_Anzeige" 1 "Anzeige_im_Fahrzeugstatus" 2 "PopUp_ohne_Gong__Eintrag_FhzStat" 3 "PopUp_mit_Gong__Eintrag_FhzStat"; -VAL_ 706 MO_Red_Fahrleistung 0 "keine_Anzeige" 1 "kleine_Red" 2 "mittlere_Red_temp" 3 "mittlere_Red" 4 "grosse_Red_temp" 5 "grosse_Red"; -VAL_ 706 MO_Anz_Kuehlerluefter 0 "Kein_KuehlerluefterNachlauf" 1 "Text_Luefternachlauf_aktiv" 2 "Text_Luefternachlauf_DPF_aktiv" 3 "Platzhalter_weitere_Signale" 4 "Platzhalter_weitere_Signale" 5 "Platzhalter_weitere_Signale" 6 "Platzhalter_weitere_Signale" 7 "Platzhalter_weitere_Signale"; -VAL_ 706 MO_im_Leerlauf 0 "nicht_im_Leerlauf" 1 "im_Leerlauf"; -VAL_ 706 WIV_Enable_Oeldr_Motor 0 "Oeldruckauswertung_im_Kombi" 1 "Oeldruckauswertung_im_MSG"; -VAL_ 706 MO_OelMessung_Dauer 15 "keine_Messung_aktiv"; -VAL_ 706 TSK_vMax_FahrerInfo 0 "Init___kein_Wert"; -VAL_ 768 ACC_Tempolimit 0 "keine_Anzeige" 1 "5_zulHoechstgeschw" 2 "7_zulHoechstgeschw" 3 "10_zulHoechstgeschw" 4 "15_zulHoechstgeschw" 5 "20_zulHoechstgeschw" 6 "25_zulHoechstgeschw" 7 "30_zulHoechstgeschw" 8 "35_zulHoechstgeschw" 9 "40_zulHoechstgeschw" 10 "45_zulHoechstgeschw" 11 "50_zulHoechstgeschw" 12 "55_zulHoechstgeschw" 13 "60_zulHoechstgeschw" 14 "65_zulHoechstgeschw" 15 "70_zulHoechstgeschw" 16 "75_zulHoechstgeschw" 17 "80_zulHoechstgeschw" 18 "85_zulHoechstgeschw" 19 "90_zulHoechstgeschw" 20 "95_zulHoechstgeschw" 21 "100_zulHoechstgeschw" 22 "110_zulHoechstgeschw" 23 "120_zulHoechstgeschw" 24 "130_zulHoechstgeschw" 25 "140_zulHoechstgeschw" 26 "150_zulHoechstgeschw" 27 "160_zulHoechstgeschw" 28 "200_zulHoechstgeschw" 30 "250_zulHoechstgeschw" 31 "Ende_zulHoechstgeschw"; -VAL_ 768 ACC_Wunschgeschw_Farbe 0 "Grundfarbe" 1 "Farbe_1"; -VAL_ 768 ACC_Warnung_Verkehrszeichen_1 0 "keine_Warnung_Initialwert" 1 "Warnung"; -VAL_ 768 ACA_Querfuehrung 0 "keine_Anzeige_oder_init" 1 "passiv" 2 "aktiv" 3 "Warnung"; -VAL_ 768 ACC_Regelung_AIO 0 "Regelung_Ampel_nicht_aktiv" 1 "Regelung_Ampel_aktiv"; -VAL_ 768 ACC_Wunschgeschw_02 1023 "keine_Anzeige"; -VAL_ 768 ACC_Abstandsindex_02 0 "Audi (Init), VW (passiv/aktiv_Freifahrt)" 1022 "aus_passiv" 1023 "aktiv_Freifahrt"; -VAL_ 768 ACC_Display_Prio 0 "hoechste_Prio" 1 "mittlere_Prio" 2 "geringe_Prio" 3 "keine_Prio"; -VAL_ 768 ACC_rel_Objekt_Zusatzanz 0 "keine Anzeige" 1 "Relevantes_Objekt_erkannt" 2 "Relevantes_Objekt_Abstandswarnung"; -VAL_ 768 ACC_Gesetzte_Zeitluecke 0 "keine_Anzeige" 1 "Zeitluecke_1" 2 "Zeitluecke_2" 3 "Zeitluecke_3" 4 "Zeitluecke_4" 5 "Zeitluecke_5" 6 "nicht_definiert" 7 "nicht_definiert"; -VAL_ 768 ACC_Optischer_Fahrerhinweis 0 "optischer_Fahrerhinweis_AUS" 1 "optischer_Fahrerhinweis_EIN"; -VAL_ 768 ACC_Warnhinweis 0 "kein_Warnhinweis" 1 "Warnhinweis"; -VAL_ 768 ACC_EGO_Fahrzeug 0 "keine_Anzeige" 1 "aktiv" 2 "Warnung" 3 "aktiv_stop" 4 "passiv"; -VAL_ 768 ACC_Relevantes_Objekt_02 0 "keine_Anzeige" 1 "Relevantes_Objekt_erkannt" 2 "Relevantes_Objekt_Warnung" 3 "passiv"; -VAL_ 768 ACC_Wunschgeschw_erreicht 0 "Wunschgeschwindigkeit_nicht_erreicht" 1 "Wunschgeschwindigkeit_erreicht"; -VAL_ 768 ACC_Anzeige_Zeitluecke 0 "Anzeige_Zeitluecke_nicht_angefordert" 1 "Anzeige_Zeitluecke_angefordert"; -VAL_ 768 ACC_Texte_Primaeranz_02 0 "keine Anzeige" 1 "VDA_ACC_Symbol_YYY_kmh_mph" 2 "Kurven_Symbol_YYY_kmh_mph" 3 "Tempolimit_Symbol_YYY_kmh_mph" 4 "ACC_anfahrbereit" 5 "eingestellte_Zeitluecke" 6 "Tuer offen !" 7 "Stehendes Objekt voraus" 8 "o o o" 9 "ACC aus" 10 "ACC startet" 11 "ACC Sensor Sicht !" 12 "ACC nicht verfuegbar" 13 "ACC Fehler" 14 "ESP Eingriff" 15 "ESP PASSIV !" 16 "Parkbremse !" 17 "Geschwindigkeitsgrenze" 18 "Waehlhebelposition !" 19 "Fahrer Gurtschloss offen !" 20 "Schalthebelposition !" 21 "Drehzahl !" 22 "HDC aktiv" 23 "Kupplung betaetigt" 24 "Gang einlegen !" 25 "Bremse ueberhitzt !" 26 "Steigung_Gefaelle_zu_gross" 27 "ABSTAND" 28 "Rechtsueberholen_verhindert" 29 "Linksueberholen_verhindert" 30 "Kreuzungs_Symbol" 31 "Kreisverkehr_Symbol" 32 "Gefaelle_Symbol" 33 "Tempolimit_Kurvenassistent_ein" 34 "Kurvenassistent_ein" 35 "Tempolimitassistent_ein" 36 "Achtung_Geschwindigkeitsueberschreitung" 37 "Tempolimit_und_Kurvenassistent_nicht_verfuegbar" 38 "Tempolimit_nicht_verfuegbar" 39 "Kurvenassistent_nicht_verfuegbar" 40 "Autobahnausfahrt_Symbol" 41 "Stauende_Symbol" 42 "Engstelle_Symbol" 43 "STP_verfuegbar" 44 "Ampel_vertikal" 45 "Ampel_horizontal" 46 "STA_verfuegbar"; -VAL_ 768 ACC_Texte_Zusatzanz_02 0 "keine_Anzeige" 1 "ACC_AUS" 2 "Standby" 3 "UEBERTRETEN" 4 "ABSTAND" 5 "DISTANZ_1" 6 "DISTANZ_2" 7 "DISTANZ_3" 8 "DISTANZ_4" 9 "DISTANZ_5" 10 "DISTANZ_1__dyn" 11 "DISTANZ_2__dyn" 12 "DISTANZ_3__dyn" 13 "DISTANZ_4__dyn" 14 "DISTANZ_5__dyn" 15 "DISTANZ_1__comf" 16 "DISTANZ_2__comf" 17 "DISTANZ_3__comf" 18 "DISTANZ_4__comf" 19 "DISTANZ_5__comf" 20 "DISTANZ_1__efficiency" 21 "DISTANZ_2__efficiency" 22 "DISTANZ_3__efficiency" 23 "DISTANZ_4__efficiency" 24 "DISTANZ_5__efficiency" 25 "DISTANZ_1__Stau" 26 "DISTANZ_2__Stau" 27 "DISTANZ_3__Stau" 28 "DISTANZ_4__Stau" 29 "DISTANZ_5__Stau" 30 "ACHTUNG" 31 "Abstandsanzeige" 32 "Abstandsanzeige_Warnung_aktiviert" 33 "STA_verfuegbar" 34 "Engstelle" 35 "RUV_aktiv_Rechtsverkehr" 36 "RUV_aktiv_Linksverkehr" 37 "STP_Verfuegbar" 38 "AW_Warnschwelle_1" 39 "AW_Warnschwelle_2" 40 "AW_Warnschwelle_3" 41 "AW_Warnung_1" 42 "AW_Warnung_2" 43 "AW_Warnung_3"; -VAL_ 768 STA_Primaeranz 0 "keine_Anzeige" 1 "STA_standby" 2 "STA_aktiv" 3 "STA_Warnung"; -VAL_ 768 Heartbeat 1 "ACC_Init_Low" 420 "ACC_Init_High" 221 "ACC_Available_Low" 360 "ACC_Available_High"; -VAL_ 768 ACC_Status_ACC 0 "ACC_OFF_Hauptschalter_aus" 1 "ACC_INIT" 2 "ACC_STANDBY" 3 "ACC_AKTIV_regelt" 4 "ACC_OVERRIDE" 5 "ACC_Abschaltreaktion" 6 "reversibler_Fehler_im_ACC_System" 7 "irreversibler_Fehler_im_ACC_System"; -VAL_ 768 Lead_Type_Detected 1 "Lead_Detected" 0 "No_Lead_Detected"; -VAL_ 768 Lead_Type 5 "Bicycle" 3 "Car" 0 "None" 2 "Truck" 4 "Motorcycle"; -VAL_ 768 ACC_Events 3 "Starting_Available" 0 "None" 5 "Speed_Limit_Camera" 9 "Street_Type" 4 "Speed_Limit_in_Nav"; -VAL_ 768 Zeitluecke_1 0 "keine Anzeige"; -VAL_ 768 Zeitluecke_2 0 "keine Anzeige" 32 "Minimum"; -VAL_ 768 Zeitluecke_3 0 "keine Anzeige"; -VAL_ 768 Zeitluecke_4 0 "keine Anzeige" 40 "Minimum"; -VAL_ 768 Zeitluecke_5 0 "keine Anzeige"; -VAL_ 795 ESP_Lampe 0 "Aus" 1 "Ein"; -VAL_ 795 ABS_Lampe 0 "Aus" 1 "Ein"; -VAL_ 795 BK_Lampe_02 0 "aus" 1 "ein_statisch" 3 "Warnung"; -VAL_ 795 TC_Lampe 0 "Aus" 1 "Ein"; -VAL_ 795 ESP_m_Raddrehz 32765 "Unterspannung" 32766 "Init" 32767 "Fehler"; -VAL_ 795 ESP_Textanzeigen_03 0 "kein_Text" 1 "ESP_Stoerung" 2 "ABS_Stoerung" 3 "ESP_ABS_Stoerung" 4 "Werkstatt_Bremse" 5 "ASR_Stoerung" 6 "ESP_switched_off" 7 "ASR_off" 8 "ESP_ASR_on" 10 "keine_Bremskraftverstaerkung" 11 "ASR_aktiviert" 12 "ABS_ASR_Stoerung" 15 "ESP_offroad" 17 "ESP_sport" 18 "ESP_Zwangsaktivierung" 19 "ESP_Taster_Info" 20 "TC_aktiv" 21 "reserviert_fuer_Verlwarn" 22 "TC_switched_off" 23 "Verlwarn_akt_Rollsicher_inakt" 24 "ESP_SuperSport" 25 "ESP_Offroad_nicht_verfuegbar"; -VAL_ 795 ESP_Meldungen 0 "keine_Anzeige" 1 "Autohold_Hinweis_1" 2 "Stoerung_Autohold" 3 "Stoerung_Hillholder" 4 "Uebernehmen" 5 "Autohold_aus" 6 "Autohold_Hinweis_2"; -VAL_ 795 ESP_Fehlerstatus_Wegimp 0 "Wegimpulse_iO" 1 "Fehler"; -VAL_ 795 ESP_Wegimp_Ueberlauf 0 "Reset_und_kein_Ueberlauf" 1 "mindestens_1x_Ueberlauf"; -VAL_ 795 ESP_QBit_Wegimp_VA 0 "gueltiger_Wert" 1 "Ersatz_Init_oder_Fehlerwert"; -VAL_ 795 ESP_HDC_Geschw_Farbe 0 "Standard_Farbe" 1 "abweichende_Farbe"; -VAL_ 795 ESP_Off_Lampe 0 "Lampe_aus" 1 "Lampe_ein"; -VAL_ 795 ESP_HDC_Regelgeschw 0 "nicht_verbaut" 125 "HDC_Standby" 126 "Init" 127 "Fehler"; -VAL_ 795 ESP_BKV_Warnung 0 "keine_Anzeige" 1 "keine_Bremskraftverstaerkung"; -VAL_ 817 MFL_Lokalaktiv 0 "war_nicht_lokal_aktiv" 1 "war_lokal_aktiv"; -VAL_ 817 MFL_M_Taste 0 "nicht_betaetigt" 1 "betaetigt"; -VAL_ 817 MFL_Paddle_Verbau 0 "verbaut" 1 "nicht_verbaut"; -VAL_ 817 MFL_Tastencode_1 0 "Key_Released__No_Key" 1 "Context_Menu" 2 "Menu_Up__Next_Screen" 3 "Menu_Down__Previous_Screen" 4 "Up" 5 "Down" 6 "Up__Down_ThumbWheel" 7 "OK__ThumbWheel_Button" 8 "Cancel__Escape" 9 "Main_Menu" 10 "Side_Menu_left" 11 "Side_Menu_right" 12 "FAS_Menu" 13 "Left__Right_ThumbWheel" 14 "FAS_Menu_ThumbWheel" 16 "Volume_Up" 17 "Volume_Down" 18 "Volume_Up__Down_ThumbWheel" 19 "Volume_ThumbWheel_Button" 20 "Audio_Source" 21 "Arrow_A_Up__Right" 22 "Arrow_A_Down__Left" 23 "Arrow_B_Up__Right" 24 "Arrow_B_Down__Left" 25 "PTT__PushToTalk" 26 "PTT_Cancel" 27 "Route_Info" 28 "Hook" 29 "Hang_Up" 30 "Off_Hook" 31 "Light_On__Off" 32 "Mute" 33 "Joker1" 34 "Joker2" 35 "View" 36 "Arrow_A_Up__Down_ThumbWheel" 37 "Lenkradheizung" 38 "Rekuperation" 39 "Tube_Toggle" 40 "DRS_Drag_Reduction_System" 41 "Stopwatch_Start_Stop" 42 "Stopwatch_Nextlap" 100 "MAP" 101 "MAP_Boost" 102 "Turn_signal_left" 103 "Turn_signal_right" 104 "Turn_signal_off" 105 "Flashlight" 106 "Highbeam" 107 "Washer_button" 108 "Wiper_button_left" 109 "Wiper_button_right" 110 "Wiper_button_cancel" 111 "Exhaust_Sound" 112 "Drive_Select_button" 113 "Sport_button" 114 "ESP_Drift_Selection_ThumbWheel" 115 "PTT_special_vehicle" 116 "TravelAssist" 117 "Launch_Control" 118 "Drift_Mode_Button_Increase" 119 "Drift_Mode_Button_Decrease" 120 "Drift_Mode_Button_Select" 121 "Drive_Mode_Button_Increase" 122 "Drive_Mode_Button_Decrease" 123 "Drive_Mode_Button_Select" 124 "E_Boost_Button_Increase" 125 "E_Boost_Button_Decrease" 126 "E_Boost_Button_Select" 127 "PerformanceHybridButton_Increase" 128 "PerformanceHybridButton_Decrease" 129 "EV_Mode_Button" 130 "HUD_Button" 131 "PASM_Wheel" 132 "PASM_Button" 133 "PTV_Wheel" 134 "PTV_Button" 135 "TC_ESC_Wheel" 136 "TC_ESC_Button" 240 "Startup_Reset" 241 "Initialization"; -VAL_ 817 MFL_Tastencode_2 0 "Key_Released__No_Key" 1 "Context_Menu" 2 "Menu_Up__Next_Screen" 3 "Menu_Down__Previous_Screen" 4 "Up" 5 "Down" 6 "Up__Down_ThumbWheel" 7 "OK__ThumbWheel_Button" 8 "Cancel__Escape" 9 "Main_Menu" 10 "Side_Menu_left" 11 "Side_Menu_right" 12 "FAS_Menu" 13 "Left__Right_ThumbWheel" 14 "FAS_Menu_ThumbWheel" 16 "Volume_Up" 17 "Volume_Down" 18 "Volume_Up__Down_ThumbWheel" 19 "Volume_ThumbWheel_Button" 20 "Audio_Source" 21 "Arrow_A_Up__Right" 22 "Arrow_A_Down__Left" 23 "Arrow_B_Up__Right" 24 "Arrow_B_Down__Left" 25 "PTT__PushToTalk" 26 "PTT_Cancel" 27 "Route_Info" 28 "Hook" 29 "Hang_Up" 30 "Off_Hook" 31 "Light_On__Off" 32 "Mute" 33 "Joker1" 34 "Joker2" 35 "View" 36 "Arrow_A_Up_Right_Down_Left_ThumbWheel" 37 "Lenkradheizung" 38 "Rekuperation" 39 "Tube_Toggle" 40 "DRS_Drag_Reduction_System" 41 "Stopwatch_Start_Stop" 42 "Stopwatch_Nextlap" 100 "MAP" 101 "MAP_Boost" 102 "Turn_signal_left" 103 "Turn_signal_right" 104 "Turn_signal_off" 105 "Flashlight" 106 "Highbeam" 107 "Washer_button" 108 "Wiper_button_left" 109 "Wiper_button_right" 110 "Wiper_button_cancel" 111 "Exhaust_Sound" 112 "Drive_Select_button" 113 "Sport_button" 114 "ESP_Drift_Selection_ThumbWheel" 115 "PTT_special_vehicle" 116 "TravelAssist" 117 "Launch_Control" 118 "Drift_Mode_Button_Increase" 119 "Drift_Mode_Button_Decrease" 120 "Drift_Mode_Button_Select" 121 "Drive_Mode_Button_Increase" 122 "Drive_Mode_Button_Decrease" 123 "Drive_Mode_Button_Select" 124 "E_Boost_Button_Increase" 125 "E_Boost_Button_Decrease" 126 "E_Boost_Button_Select" 127 "PerformanceHybridButton_Increase" 128 "PerformanceHybridButton_Decrease" 129 "EV_Mode_Button" 130 "HUD_Button" 131 "PASM_Wheel" 132 "PASM_Button" 133 "PTV_Wheel" 134 "PTV_Button" 135 "TC_ESC_Wheel" 136 "TC_ESC_Button" 240 "Startup_Reset" 241 "Initialization"; -VAL_ 817 MFL_Eventcode_1 0 "W_no_event____T_no_event" 1 "W_1_Tick_up__T_pressed_normal" 2 "W_2_Ticks_up__T_touched" 3 "W_3_Ticks_up__T_double_click_nor" 4 "W_4_Ticks_up__T_long_press_nor_1" 5 "W_5_Ticks_up__T_long_press_nor_2" 6 "W_6_Ticks_up__T_long_press_nor_3" 7 "W_7_Ticks_up" 9 "W_7_Ticks_dn__T_pressed_strong" 10 "W_6_Ticks_dn" 11 "W_5_Ticks_dn__T_double_click_str" 12 "W_4_Ticks_dn__T_long_press_str_1" 13 "W_3_Ticks_dn__T_long_press_str_2" 14 "W_2_Ticks_dn__T_long_press_str_3" 15 "W_1_Tick_dn"; -VAL_ 817 MFL_Eventcode_2 0 "W_no_event____T_no_event" 1 "W_1_Tick_up__T_pressed_normal" 2 "W_2_Ticks_up__T_touched" 3 "W_3_Ticks_up__T_double_click_nor" 4 "W_4_Ticks_up__T_long_press_nor_1" 5 "W_5_Ticks_up__T_long_press_nor_2" 6 "W_6_Ticks_up__T_long_press_nor_3" 7 "W_7_Ticks_up" 9 "W_7_Ticks_dn__T_pressed_strong" 10 "W_6_Ticks_dn" 11 "W_5_Ticks_dn__T_double_click_str" 12 "W_4_Ticks_dn__T_long_press_str_1" 13 "W_3_Ticks_dn__T_long_press_str_2" 14 "W_2_Ticks_dn__T_long_press_str_3" 15 "W_1_Tick_dn"; -VAL_ 817 MFL_Marke 0 "VW" 1 "Audi" 2 "Seat" 3 "Skoda" 4 "VW_Nutzf" 5 "Bugatti" 6 "Lamborghini" 7 "Bentley" 8 "Rolls Royce" 9 "Quattro" 10 "kein_Hersteller_1" 11 "kein_Hersteller_2" 12 "kein_Hersteller_3" 13 "kein_Hersteller_4" 14 "Ford" 15 "Porsche"; -VAL_ 817 MFL_Tip_Down 0 "nicht_betaetigt" 1 "betaetigt"; -VAL_ 817 MFL_Tip_Up 0 "nicht_betaetigt" 1 "betaetigt"; -VAL_ 817 MFL_SatModul_links_Err 0 "kein_Fehler" 1 "Fehler"; -VAL_ 817 MFL_SatModul_rechts_Err 0 "kein_Fehler" 1 "Fehler"; -VAL_ 817 MFL_LR_HZG_Status 0 "inaktiv" 1 "aktiv"; -VAL_ 817 MFL_LR_HZG_Err 0 "normal" 1 "Fehler"; -VAL_ 817 MFL_Signalhorn 0 "nicht_betaetigt" 1 "betaetigt"; -VAL_ 817 MFL_Signalhorn_Err 0 "normal" 1 "Fehler"; -VAL_ 817 MFL_Tip_links_Err 0 "normal" 1 "Fehler"; -VAL_ 817 MFL_Tip_rechts_Err 0 "normal" 1 "Fehler"; -VAL_ 817 MFL_Taste_links_Err 0 "normal" 1 "Fehler"; -VAL_ 817 MFL_Taste_rechts_Err 0 "normal" 1 "Fehler"; -VAL_ 817 MFL_ECU_Err 0 "normal" 1 "Fehler"; -VAL_ 817 MFL_Response_Err 0 "normal" 1 "Fehler"; -VAL_ 850 Parken_SM_03_MUX 0 "MUX_Gruppe_Punktinfo_0" 1 "MUX_Gruppe_Punktinfo_1" 2 "MUX_Gruppe_Punktinfo_2" 3 "MUX_Gruppe_Punktinfo_3" 4 "MUX_Gruppe_Punktinfo_4" 5 "MUX_Gruppe_Punktinfo_5" 6 "MUX_Gruppe_Punktinfo_6"; -VAL_ 850 Parken_SM_03_Traj_Trans_ID_00 0 "Transaktions_ID_0" 1 "Transaktions_ID_1" 2 "Transaktions_ID_2" 3 "Transaktions_ID_3" 4 "Transaktions_ID_4" 5 "Transaktions_ID_5" 6 "Transaktions_ID_6" 7 "Transaktions_ID_7" 8 "Transaktions_ID_8" 9 "Transaktions_ID_9" 10 "Transaktions_ID_10" 11 "Transaktions_ID_11" 12 "Transaktions_ID_12" 13 "Transaktions_ID_13" 14 "Transaktions_ID_14" 15 "Transaktions_ID_15"; -VAL_ 850 Parken_SM_03_Traj_Trans_ID_01 0 "Transaktions_ID_0" 1 "Transaktions_ID_1" 2 "Transaktions_ID_2" 3 "Transaktions_ID_3" 4 "Transaktions_ID_4" 5 "Transaktions_ID_5" 6 "Transaktions_ID_6" 7 "Transaktions_ID_7" 8 "Transaktions_ID_8" 9 "Transaktions_ID_9" 10 "Transaktions_ID_10" 11 "Transaktions_ID_11" 12 "Transaktions_ID_12" 13 "Transaktions_ID_13" 14 "Transaktions_ID_14" 15 "Transaktions_ID_15"; -VAL_ 850 Parken_SM_03_Traj_Trans_ID_02 0 "Transaktions_ID_0" 1 "Transaktions_ID_1" 2 "Transaktions_ID_2" 3 "Transaktions_ID_3" 4 "Transaktions_ID_4" 5 "Transaktions_ID_5" 6 "Transaktions_ID_6" 7 "Transaktions_ID_7" 8 "Transaktions_ID_8" 9 "Transaktions_ID_9" 10 "Transaktions_ID_10" 11 "Transaktions_ID_11" 12 "Transaktions_ID_12" 13 "Transaktions_ID_13" 14 "Transaktions_ID_14" 15 "Transaktions_ID_15"; -VAL_ 850 Parken_SM_03_Traj_Trans_ID_03 0 "Transaktions_ID_0" 1 "Transaktions_ID_1" 2 "Transaktions_ID_2" 3 "Transaktions_ID_3" 4 "Transaktions_ID_4" 5 "Transaktions_ID_5" 6 "Transaktions_ID_6" 7 "Transaktions_ID_7" 8 "Transaktions_ID_8" 9 "Transaktions_ID_9" 10 "Transaktions_ID_10" 11 "Transaktions_ID_11" 12 "Transaktions_ID_12" 13 "Transaktions_ID_13" 14 "Transaktions_ID_14" 15 "Transaktions_ID_15"; -VAL_ 850 Parken_SM_03_Traj_Trans_ID_04 0 "Transaktions_ID_0" 1 "Transaktions_ID_1" 2 "Transaktions_ID_2" 3 "Transaktions_ID_3" 4 "Transaktions_ID_4" 5 "Transaktions_ID_5" 6 "Transaktions_ID_6" 7 "Transaktions_ID_7" 8 "Transaktions_ID_8" 9 "Transaktions_ID_9" 10 "Transaktions_ID_10" 11 "Transaktions_ID_11" 12 "Transaktions_ID_12" 13 "Transaktions_ID_13" 14 "Transaktions_ID_14" 15 "Transaktions_ID_15"; -VAL_ 850 Parken_SM_03_Traj_Trans_ID_05 0 "Transaktions_ID_0" 1 "Transaktions_ID_1" 2 "Transaktions_ID_2" 3 "Transaktions_ID_3" 4 "Transaktions_ID_4" 5 "Transaktions_ID_5" 6 "Transaktions_ID_6" 7 "Transaktions_ID_7" 8 "Transaktions_ID_8" 9 "Transaktions_ID_9" 10 "Transaktions_ID_10" 11 "Transaktions_ID_11" 12 "Transaktions_ID_12" 13 "Transaktions_ID_13" 14 "Transaktions_ID_14" 15 "Transaktions_ID_15"; -VAL_ 850 Parken_SM_03_Traj_Trans_ID_06 0 "Transaktions_ID_0" 1 "Transaktions_ID_1" 2 "Transaktions_ID_2" 3 "Transaktions_ID_3" 4 "Transaktions_ID_4" 5 "Transaktions_ID_5" 6 "Transaktions_ID_6" 7 "Transaktions_ID_7" 8 "Transaktions_ID_8" 9 "Transaktions_ID_9" 10 "Transaktions_ID_10" 11 "Transaktions_ID_11" 12 "Transaktions_ID_12" 13 "Transaktions_ID_13" 14 "Transaktions_ID_14" 15 "Transaktions_ID_15"; -VAL_ 869 NVEM_Pilot_Info 0 "Init" 1 "keine_Einschraenkung" 2 "Veto_1" 3 "Veto_2"; -VAL_ 869 NVEM_P_Generator_Status 0 "gefiltert" 1 "ungefiltert"; -VAL_ 869 BEM_P_Generator 255 "Fehler"; -VAL_ 869 BEM_n_LLA 0 "keine_Erhoehung" 1 "Stufe_1" 2 "Stufe_2" 3 "Stufe_3"; -VAL_ 869 BEM_Anf_KL 0 "keine Anforderung" 1 "Anforderung Kühlerlüfter Ansteuerung"; -VAL_ 869 BEM_StartStopp_Info 0 "Motorlauf_nicht_notwendig_(Stoppfreigabe)" 1 "Motoranlauf_nicht_zwingend_notwendig_(Stoppverbot,keine_Startanforderung)" 2 "Motoranlauf_zwingend_notwendig_(Startanforderung)" 3 "Systemfehler"; -VAL_ 869 BEM_Batt_Ab 0 "verbunden" 1 "nicht_verbunden"; -VAL_ 869 BEM_Hybrid_Info 0 "keine_Einschraenkung_durch_Energiemanagement" 1 "Motorstart_ueber_12V_Starter_nur_bei_0kmh_moeglich" 2 "kein_Motorstart_ueber_12V_Starter_nach_el_Fahrtbetrieb" 3 "Systemfehler"; -VAL_ 869 NVEM_Red_KL 0 "Init" 1 "Abschaltung_KL" 2 "Reduzierung_KL"; -VAL_ 869 NVEM_Freilauf_Info 0 "Freilauf_freigegeben" 1 "Weiches_Veto_uebertippbar" 2 "Hartes_Veto_Abbruch" 3 "Freilauf_Anforderung"; -VAL_ 869 BEM_HYB_DC_uMinLV 254 "Init" 255 "Fehler"; -VAL_ 870 BM_ZV_auf 0 "inaktiv" 1 "aktiv"; -VAL_ 870 BM_ZV_zu 0 "inaktiv" 1 "aktiv"; -VAL_ 870 BM_DWA_ein 0 "inaktiv" 1 "aktiv"; -VAL_ 870 BM_DWA_Alarm 0 "inaktiv" 1 "aktiv"; -VAL_ 870 BM_Crash 0 "inaktiv" 1 "aktiv"; -VAL_ 870 BM_Panik 0 "inaktiv" 1 "aktiv"; -VAL_ 870 BM_Not_Bremsung 0 "inaktiv" 1 "aktiv"; -VAL_ 870 BM_GDO 0 "inaktiv" 1 "aktiv"; -VAL_ 870 BM_Warnblinken 0 "inaktiv" 1 "aktiv"; -VAL_ 870 BM_Taxi_Notalarm 0 "inaktiv" 1 "aktiv"; -VAL_ 870 BM_Telematik 0 "inaktiv" 1 "aktiv"; -VAL_ 870 BM_links 0 "inaktiv" 1 "aktiv"; -VAL_ 870 BM_rechts 0 "inaktiv" 1 "aktiv"; -VAL_ 870 Blinken_li_Fzg_Takt 0 "Blinker_links_ausgeschaltet" 1 "Blinker_links_eingeschaltet"; -VAL_ 870 Blinken_re_Fzg_Takt 0 "Blinker_rechts_ausgeschaltet" 1 "Blinker_rechts_eingeschaltet"; -VAL_ 870 Blinken_li_Kombi_Takt 0 "Blinkerkontrolllampe_links_ausgeschaltet" 1 "Blinkerkontrolllampe_links_eingeschaltet"; -VAL_ 870 Blinken_re_Kombi_Takt 0 "Blinkerkontrolllampe_rechts_ausgeschaltet" 1 "Blinkerkontrolllampe_rechts_eingeschaltet"; -VAL_ 870 BM_NBA_n_codiert_n_aktiv 0 "codiert_AND_kein_Fehler" 1 "nicht_codiert_OR_Fehler_erkannt"; -VAL_ 870 BM_NBA_Status 0 "NBA_nicht_aktiv" 1 "BRL_Dunkelphase" 3 "BRL_Hellphase"; -VAL_ 870 BM_WBT_Beleuchtung 0 "inaktiv" 1 "aktiv"; -VAL_ 870 BM_HD_Oeffnung_angelernt 0 "keine_Quittierung" 1 "Quittierung"; -VAL_ 870 BM_Autobahn 0 "inaktiv" 1 "aktiv"; -VAL_ 870 BM_Rollenmodus_Blinken 0 "inaktiv" 1 "aktiv"; -VAL_ 870 BM_Recas 0 "inaktiv" 1 "aktiv"; -VAL_ 870 BM_Wischblinken 0 "inaktiv" 1 "aktiv"; -VAL_ 870 BM_Telematik_Abbruchgrund 0 "Init" 1 "speed_out_of_range" 2 "defect" 3 "clamp_s_on" 4 "clamp_15_on" 5 "door_open" 6 "engine_hood_open" 7 "trunk_open" 8 "convertible_top_not_locked" 9 "horn_activated_by_user" 10 "Higher_Prioritiy_Function_active" 11 "Central_Lock_status_changed" 12 "Request_Dropped_by_Requester" 13 "Service_Duration_Expired" 14 "not_possible_due_to_coding" 15 "no_reason_or_unknown_timeout"; -VAL_ 870 BM_PiloPa 0 "PiloPa_Blinkerquittierung_inaktiv" 1 "PiloPa_Blinkerquittierung_aktiv"; -VAL_ 870 DWA_Alarmquelle 0 "kein_Ausloesegrund" 1 "Tuerkontakt_Fahrertuer" 2 "Tuerkontakt_Beifahrertuer" 3 "Tuerkontakt_hinten_links" 4 "Tuerkontakt_hinten_rechts" 5 "Motorhaubenkontakt_vorne" 6 "Kofferraum_hinten" 7 "Masseschleife_der_Heckscheibe" 8 "Innenraumueberwachung" 9 "Alarm_durch_Noteinstieg" 10 "Sounder" 11 "Neigungssensor" 12 "TSG_FT_am_CAN_Bus" 13 "TSG_BT_am_CAN_Bus" 14 "TSG_HFS_am_CAN_Bus" 15 "TSG_HBFS_am_CAN_Bus" 16 "Klemme_15" 17 "Klemme_15sig" 18 "frei" 19 "Anhaengerueberwachung" 20 "Scheinwerferueberwachung_links" 21 "Scheinwerferueberwachung_rechts" 22 "Handschuhkasten" 23 "Verdeckueberwachung" 24 "OBD_Alarm" 25 "Power_on_Reset" 30 "Init" 31 "Fehler"; -VAL_ 888 GNSS_Ortung_Hoehe 4094 "Init" 4095 "Fehler"; -VAL_ 891 GNSS_UTC_Zeit 0 "Init"; -VAL_ 891 GNSS_Empfaenger_Status 0 "Backup_Mode" 1 "Live"; -VAL_ 891 GNSS_GPS_in_Nutzung 0 "unbenutzt" 1 "benutzt"; -VAL_ 891 GNSS_GLONASS_in_Nutzung 0 "unbenutzt" 1 "benutzt"; -VAL_ 891 GNSS_Empfangbare_Satelliten 0 "Init" 31 "31_oder_mehr"; -VAL_ 891 GNSS_Sichtbare_Satelliten 0 "Init" 31 "31_oder_mehr"; -VAL_ 891 GNSS_Genutzte_Satelliten 0 "Init" 31 "31_oder_mehr"; -VAL_ 916 WBA_Fahrstufe_02 0 "Zwischenstellung_keine_Position" 1 "Position_P" 2 "Position_R" 3 "Position_N" 4 "Position_D" 5 "Position_S" 6 "Position_M_Tippfunktion" 7 "Kurzzeit_M" 8 "Position_E" 9 "Position_MS" 10 "Position_S_Plus" 11 "Position_MS_Plus" 12 "Position_Offroad" 13 "Position_B"; -VAL_ 916 WBA_ZielFahrstufe 0 "keine_Gangempfehlung_kein_Gang_eingelegt" 1 "Pfeil_nach_S" 2 "Pfeil_nach_D" 3 "Pfeil_nach_M" 4 "Pfeil_nach_E"; -VAL_ 916 WBA_GE_Warnung_02 0 "keine_Anzeige" 1 "Fehlereskalationsstufe_I" 2 "Fehlereskalationsstufe_II" 3 "Weiterfahrt_nur_eingeschraenkt_moeglich__Kein_R_Gang" 4 "Getriebefehler_Weiterfahrt_nur_in_D_moeglich__P_bei_Motor_aus" 5 "Wegrollgefahr__P_nicht_moeglich" 6 "Paddlenotbetrieb_Schema+Warnung" 7 "Paddlenotbetrieb_Schema" 8 "Geschwindigkeitsbegrenzung_Notlauf" 9 "Fehlereskalationsst_o_Einschr" 10 "Fehlereskalationsstufe_v_Limit" 11 "Parksperre_Infostufe" 12 "Parksperre_Warnstufe_I" 13 "Parksperre_Warnstufe_II"; -VAL_ 916 WBA_eing_Gang_02 0 "keine_Ganganzeige" 1 "Gang_1" 2 "Gang_2" 3 "Gang_3" 4 "Gang_4" 5 "Gang_5" 6 "Gang_6" 7 "Gang_7" 8 "Gang_8" 9 "Gang_9" 10 "Funktion_Ganganzeigeunterdrueckung" 11 "Gang_10"; -VAL_ 916 WBA_GE_Texte 0 "keine_Anzeige" 1 "zum_Einlegen_einer_Fahrstufe_Fussbremse_betaetigen__ShiftLock_Information" 2 "zum_Einlegen_von_R_N_D_Fussbremse_betaetigen_und_Motor_starten" 3 "Wegrollgefahr_bitte_P_einlegen" 4 "Achtung_Zeitueberschreitung_P_wird_eingelegt" 5 "Wiederanmeldeprozedur_Bremse_betaetigen" 6 "P_nur_im_Stillstand_moeglich" 7 "Rennstart_aktiv"; -VAL_ 916 WBA_Segeln_aktiv 0 "inaktiv" 1 "aktiv"; -VAL_ 916 WBA_Schaltschema 0 "kein_Schaltschema" 1 "xxxD(S)" 2 "xxxD_S" 3 "xxxS(D)" 4 "xxxS_D" 5 "xxxM(D)" 6 "xxxM_D" 7 "xxxM(S)" 8 "xxxM_S" 9 "xxxE(D)" 10 "xxxE_D" 11 "xxxE(S)" 12 "xxxE_S" 13 "xxxE(M)" 14 "xxxE_M"; -VAL_ 916 WBA_GE_Zusatzwarnungen 0 "keine_Anzeige" 1 "Getriebeueberhitzung_Warnstufe_I" 2 "Getriebeueberhitzung_Warnstufe_II" 3 "Getriebefehler_Bitte_anhalten_und_P_einlegen"; -VAL_ 916 GE_Sollgang 0 "keine_Empfehlung" 1 "Gang_1" 2 "Gang_2" 3 "Gang_3" 4 "Gang_4" 5 "Gang_5" 6 "Gang_6" 7 "Gang_7" 8 "Gang_8" 9 "Gang_9" 11 "Gang_10"; -VAL_ 916 GE_Tipschaltempf_verfuegbar 0 "nicht_verfuegbar" 1 "verfuegbar"; -VAL_ 916 WBA_GE_Texte_02 0 "Keine_Anzeige" 1 "Fahrtrichtungswechsel_nur_nach_Stillstandt" 2 "Ladestecker_gesteckt" 3 "zusaetzlicher_Service_erforderlich" 4 "eLaunch_Aktiv" 5 "eLaunch_nicht_moeglich" 6 "WH_S_nicht_moeglich_Offroad" 7 "WH_S_nicht_moeglich_RangeMode"; -VAL_ 916 WBA_GE_Texte_03 0 "init" 1 "LC_not_available" 2 "LCperformance_not_possible" 3 "LCperformance_possible" 4 "LCperformance_armed" 5 "LCperformance_preparation" 6 "LCperformance_launch" 7 "LCperformance_aborted" 8 "LCsmoke_not_possible" 9 "LCsmoke_possible" 10 "LCsmoke_armed" 11 "LCsmoke_launch" 12 "LCsmoke_aborted" 15 "Fehler"; -VAL_ 916 WBA_Blinken 0 "kein_WBA_Blinken" 1 "WBA_Blinken"; -VAL_ 916 GE_Wiederstart_Anz_Std 0 "keine_Anzeige" 1 "Standard_Wiederstartgrund"; -VAL_ 916 GE_Stoppverbot_Anz_01 0 "keine_Anzeige" 1 "Temperaturbedingung"; -VAL_ 916 GE_Stoppverbot_Anz_02 0 "keine_Anzeige" 1 "Drucksensorausfall"; -VAL_ 916 GE_Stoppverbot_Anz_03 0 "keine_Anzeige" 1 "Grundeinstellung"; -VAL_ 916 GE_Stoppverbot_Anz_04 0 "keine_Anzeige" 1 "Demontagestellung"; -VAL_ 916 GE_Stoppverbot_Anz_05 0 "keine_Anzeige" 1 "Eingeschraenkte_Fahrfunktion_Notlauf_Liegenbleiber"; -VAL_ 916 GE_Stoppverbot_Anz_06 0 "keine_Anzeige" 1 "Stoppverbot_ueber_Applikation"; -VAL_ 916 GE_Stoppverbot_Anz_07 0 "keine_Anzeige" 1 "Schaltung_aktiv"; -VAL_ 916 GE_Stoppverbot_Anz_Std 0 "keine_Anzeige" 1 "Standard_Stoppvetogrund"; -VAL_ 919 LDW_Gong 1 "Chime" 2 "Beep" 0 "None"; -VAL_ 919 LDW_Texte 8 "laneAssistTakeOver" 4 "laneAssistTakeOverUrgent" 0 "none"; -VAL_ 949 KL_Drehz_Anh 0 "keine_Anhebung" 1 "Drehzahlanhebung_vom_Motor_angefordert"; -VAL_ 949 KL_Vorwarn_Komp_ein 0 "Init" 1 "Vorwarnung_Kompressor_ein"; -VAL_ 949 KL_AC_Schalter 0 "aus" 1 "ein"; -VAL_ 949 KL_Komp_Moment_alt 1 "veraltet_bzw_Ermittlung_des_Moments_nicht_moeglich__zB_keine_Drehzahl_kein_Kaeltemitteldruck"; -VAL_ 949 KL_Vorwarn_Zuheizer_ein 0 "keine_Vorwarnung" 1 "Vorwarnung_Zuheizer_ein"; -VAL_ 949 KL_Zustand 0 "Aus" 1 "Ein"; -VAL_ 949 KL_Kompressorkupplung_linear 253 "volle_Ansteuerung" 254 "Init__nicht_bedient"; -VAL_ 949 KL_Charisma_FahrPr 0 "keine_Funktion" 1 "Programm_1" 2 "Programm_2" 3 "Programm_3" 4 "Programm_4" 5 "Programm_5" 6 "Programm_6" 7 "Programm_7" 8 "Programm_8" 9 "Programm_9" 10 "Programm_10" 11 "Programm_11" 12 "Programm_12" 13 "Programm_13" 14 "Programm_14" 15 "Programm_15"; -VAL_ 949 KL_Charisma_Status 0 "Init" 1 "verfuegbar" 2 "nicht_verfuegbar" 3 "asynchron_durch_Fahrerwunsch"; -VAL_ 949 KL_nachtr_Stopp_Anf 0 "nicht_angefordert" 1 "angefordert"; -VAL_ 949 KL_T_Charge 0 "Taster_nicht_betaetigt" 1 "Taster_betaetigt"; -VAL_ 949 KL_Last_Kompr 255 "Fehler"; -VAL_ 949 KL_Spannungs_Anf 0 "keine_Anforderung" 1 "Anforderung_Stufe_1" 2 "Anforderung_Stufe_2" 3 "Anforderung_Stufe_3"; -VAL_ 949 KL_Thermomanagement 0 "keine_Freigabe_TMM__max_Heizbedarf" 1 "kleine_Freigabe_TMM" 2 "mittlere_Freigabe_TMM" 3 "volle_Freigabe_TMM__kein_Heizbedarf"; -VAL_ 949 KL_StartStopp_Info 0 "Motorlauf_nicht_notwendig_(Stoppfreigabe)" 1 "Motoranlauf_nicht_zwingend_notwendig_(Stoppverbot,keine_Startanforderung)" 2 "Motoranlauf_zwingend_notwendig_(Startanforderung)" 3 "Systemfehler"; -VAL_ 949 KL_Freilauf_Info 0 "Freilauf_freigegeben" 1 "Uebergang_in_Freilauf_unzulaessig" 2 "Freilauf_nicht_freigegeben_Abbruch" 3 "Freilauf_Anforderung"; -VAL_ 949 KL_Anf_KL 255 "Fehler"; -VAL_ 949 KL_el_Zuheizer_Stufe 0 "Aus" 1 "Stufe_1" 2 "Stufe_2" 3 "Stufe_3"; -VAL_ 949 KL_Ausstattung_Klima 0 "Heizung_elektrisch" 1 "Klimamanuell_elektrisch" 2 "Climatic__1_Zone" 3 "Climatronic__1_Zone" 4 "Climatronic__2_Zonen" 5 "Climatronic__3_Zonen" 6 "Climatronic__4_Zonen" 7 "reserviert"; -VAL_ 949 KL_Variante_Standheizung 0 "Wasserstandheizung_60_min_Laufzeit" 1 "Luftstandheizung_120_min_Laufzeit" 2 "Wasserstandheizung_120_min_Laufzeit" 3 "Wasser_und_Luftstandheizung_120_min_Laufzeit"; -VAL_ 958 MO_StartStopp_Status 0 "System_in_diesem_KL15_Zyklus_nicht_verfuegbar" 1 "System_aktiv_keine_Freigabe_durch_StartStop_Koordinator" 2 "System_aktiv_alle_Freigaben_liegen_vor" 3 "System_aktiv_mindestens_eine_Freigabe_fehlt"; -VAL_ 958 MO_StartStopp_Wiederstart 0 "Wiederstart_inaktiv" 1 "Wiederstart_aktiv"; -VAL_ 958 MO_StartStopp_Motorstopp 0 "Motor_Stop_inaktiv" 1 "Motor_Stop_aktiv"; -VAL_ 958 MO_Freig_Reku 0 "Rekuperations-Modus aus" 1 "Empfehlung Spannungsanhebung" 2 "Empfehlung Spannungsabsenkung" 3 "Rekuperationsmodus aktiv, Spannungsvariation nicht notwendig"; -VAL_ 958 MO_Kl_75 0 "Aus" 1 "Ein"; -VAL_ 958 MO_Kl_50 0 "aus" 1 "KL50_ein_Startausfuehrung_Fahrer"; -VAL_ 958 MO_Gangposition 0 "Gang_N" 1 "Gang_1" 2 "Gang_2" 3 "Gang_3" 4 "Gang_4" 5 "Gang_5" 6 "Gang_6" 7 "Gang_7" 8 "Gang_8" 9 "Automat_P" 10 "Automat_Vorwaerts_S" 11 "Automat_Vorwaerts_D/E" 12 "Zwischenstellung" 13 "Gang_R" 14 "Istgang_nicht_definiert" 15 "Fehler"; -VAL_ 958 MO_StartStopp_Fahrerwunsch 0 "Init" 1 "Stoppverbot_durch_Fahrer" 2 "Stoppfreigabe_durch_Fahrer" 3 "Stoppanforderung_durch_Fahrer"; -VAL_ 958 MO_HYB_Fahrbereitschaft 0 "keine_Fahrbereitschaft" 1 "Fahrbereitschaft"; -VAL_ 958 MO_Ext_E_Fahrt_aktiv 0 "Rueckmeldung_E_Taster_aus" 1 "Rueckmeldung_E_Taster_ein"; -VAL_ 958 MO_Fahrer_bremst 0 "kein_Bremsen" 1 "Bremse_betaetigt"; -VAL_ 958 MO_QBit_Fahrer_bremst 0 "gueltiger_Wert" 1 "Ersatz_Init_oder_Fehlerwert"; -VAL_ 958 MO_BLS 0 "kein_Bremsen" 1 "Bremse_betaetigt"; -VAL_ 958 MO_Konsistenz_Bremsped 0 "Bremspedalinformation_plausibel" 1 "Bremspedalinformation_unplausibel"; -VAL_ 958 MO_KomFehler_ESP 0 "kein_Fehler" 1 "Fehler"; -VAL_ 958 MO_Klima_Eingr 0 "kein Eingriff" 1 "Klimakompressor ausschalten" 2 "Klimakompressor Leistungsreduzierung" 3 "Klimakompressor aufgrund der Heissleuchtenvorwarnung ausschalten"; -VAL_ 958 MO_Aussp_Anlass 0 "Anlasser_darf_angesteuert_werden" 1 "Anlasser_ausspuren__Ansteuerung_nicht_moeglich"; -VAL_ 958 MO_Freig_Anlass 0 "Start_nicht_zulaessig" 1 "Startfreigabe"; -VAL_ 958 MO_Kuppl_schalter 0 "Schalter_sagt_ausgekuppelt" 1 "Schalter_sagt_eingekuppelt"; -VAL_ 958 MO_Interlock 0 "Interlockschalter_nicht_betaetigt" 1 "Interlockschalter_betaetigt"; -VAL_ 958 MO_Motor_laeuft 0 "Motor_laeuft_nicht" 1 "Motor_laeuft_autark_und_stabil_und_darf_mechanisch_belastet_werden"; -VAL_ 958 MO_Kickdown 0 "kein_Kickdown" 1 "Kickdown"; -VAL_ 958 MO_QBit_KL_75 0 "gueltiger_Wert" 1 "Ersatz_Init_oder_Fehlerwert"; -VAL_ 958 MO_EKlKomLeiRed 0 "keine_Leistungsbegr" 1 "Leistungsbegr_75" 2 "Leistungsbegr_50" 3 "Leistungsbegr_25"; -VAL_ 958 MO_Handshake_STH 0 "keine EKP-Ansteuerung durch STH-Anforderung" 1 "EKP-Ansteuerung durch STH-Anforderung"; -VAL_ 958 MO_BKV_Unterdruckwarnung 0 "Unterdruckhaushalt_iO" 1 "Unterdruckhaushalt_niO"; -VAL_ 958 MO_Freigabe_Segeln 0 "Segelbetrieb_nicht_freigegeben" 1 "Segelbetrieb_freigegeben"; -VAL_ 958 MO_PTC_Status 0 "nicht_unterstuetzt" 1 "Stufe_0" 2 "Stufe_1" 3 "Stufe_2" 4 "Stufe_3" 7 "PTC_am_BCM"; -VAL_ 958 MO_QBit_Gangposition 0 "gueltiger_Wert" 1 "Ersatz_Init_oder_Fehlerwert"; -VAL_ 958 MO_Signalquelle_Gangposition 0 "Sensorsignal" 1 "Modellsignal"; -VAL_ 958 MO_Remotestart_Betrieb 0 "MSG_nicht_bereit_fuer_RS_Betrieb" 1 "MSG_bereit_fuer_oder_im_RS_Betrieb"; -VAL_ 958 MO_Remotestart_moeglich 0 "Remotestart_nicht_moeglich" 1 "Remotestart_moeglich"; -VAL_ 958 MO_FMAus_aktiv 0 "inaktiv" 1 "Segeln_mit_Motor_aus_aktiv"; -VAL_ 958 MO_FMAus_Startvariante 0 "kein_Motorstart" 1 "Motorstart_elektrischer_Starter" 2 "GetriebeAnschleppstart" 3 "GetriebeNotAnschleppstart"; -VAL_ 958 MO_BMS_NV_Anf_stuetzen 0 "nicht_notwendig" 1 "notwendig"; -VAL_ 958 MO_Zylinderabschaltung 0 "Vollmotorbetrieb_VMB" 1 "Uebergang_HMB_in_VMB" 2 "Uebergang_VMB_in_HMB" 3 "Halbmotorbetrieb_HMB"; -VAL_ 958 MO_HYB_VM_aktiv 0 "VM_nicht_aktiv" 1 "VM_aktiv"; -VAL_ 958 MO_StartVorauss_erfuellt 0 "Signal_nicht_bedient" 1 "StartVorauss_nicht_ueberpruefbar" 2 "StartVorauss_nicht_erfuellt" 3 "StartVorauss_erfuellt"; -VAL_ 960 RSt_Fahrerhinweise 0 "Init" 1 "Fahreruebernahme_Hinweis_ZAT_Automat_ohne_Gong" 2 "Fahreruebernahme_Hinweis_ZAT_Automat_mit_Gong" 3 "Fahreruebernahme_Hinweis_ZAT_Handschalter_ohne_Gong" 4 "Fahreruebernahme_Hinweis_ZAT_Handschalter_mit_Gong" 5 "Fahreruebernahme_Hinweis_ZAS_Automat_ohne_Gong" 6 "Fahreruebernahme_Hinweis_ZAS_Automat_mit_Gong" 7 "Fahreruebernahme_Hinweis_ZAS_Handschalter_ohne_Gong" 8 "Fahreruebernahme_Hinweis_ZAS_Handschalter_mit_Gong" 9 "RemoteStart_aktiv_ohne_Gong" 10 "RemoteStart_aktiv_mit_Gong" 11 "void" 12 "void" 13 "void" 14 "void" 15 "void"; -VAL_ 960 ZAS_Kl_S 0 "aus" 1 "S_Kontakt_ein"; -VAL_ 960 ZAS_Kl_15 0 "aus" 1 "ein"; -VAL_ 960 ZAS_Kl_X 0 "aus" 1 "ein"; -VAL_ 960 ZAS_Kl_50_Startanforderung 0 "aus" 1 "KL50_ein_Startwunsch_Fahrer"; -VAL_ 960 BCM_Remotestart_Betrieb 0 "kein_RS_Betrieb" 1 "RS_Betrieb"; -VAL_ 960 ZAS_Kl_Infotainment 0 "inaktiv" 1 "aktiv"; -VAL_ 960 BCM_Remotestart_KL15_Anf 0 "inaktiv" 1 "aktiv"; -VAL_ 960 BCM_Remotestart_MO_Start 0 "nicht_angefordert" 1 "angefordert"; -VAL_ 960 KST_Warn_P1_ZST_def 0 "nicht_defekt" 1 "defekt"; -VAL_ 960 KST_Warn_P2_ZST_def 0 "nicht_defekt" 1 "defekt"; -VAL_ 960 KST_Fahrerhinweis_1 0 "inaktiv" 1 "aktiv"; -VAL_ 960 KST_Fahrerhinweis_2 0 "inaktiv" 1 "aktiv"; -VAL_ 960 BCM_Ausparken_Betrieb 0 "kein_Betrieb" 1 "Ausparkvorgang_aktiv"; -VAL_ 960 KST_Fahrerhinweis_4 0 "inaktiv" 1 "aktiv"; -VAL_ 960 KST_Fahrerhinweis_5 0 "inaktiv" 1 "aktiv"; -VAL_ 960 KST_Fahrerhinweis_6 0 "inaktiv" 1 "aktiv"; -VAL_ 967 MO_Kuehlerluefter_MUX 0 "Kuehlerluefter_1" 1 "Kuehlerluefter_2"; -VAL_ 967 MO_Kuehlerluefter_1 126 "Init" 127 "Fehler"; -VAL_ 967 MO_Kuehlerluefter_2 126 "Init" 127 "Fehler"; -VAL_ 967 MO_EFLEX_Lampe 0 "Lampe_aus" 1 "Lampe_ein" 2 "Lampe_blinkend" 3 "Lampe_blinkend_mit_Akustik"; -VAL_ 967 MO_KJS_nicht_bereit 0 "kein_Fehler" 1 "Fehler"; -VAL_ 967 MO_ITM_Warnung_Pumpe 0 "keine_Warnung" 1 "ITM_Warnung"; -VAL_ 967 WIV_Anzeige_aktiv 0 "Anzeige aus" 1 "WIV Anzeige aktiv"; -VAL_ 967 WIV_Oelmin_Warn 0 "in_Ordnung" 1 "Warnung"; -VAL_ 967 WIV_Sensorfehler 0 "in_Ordnung" 1 "Sensor_defekt"; -VAL_ 967 WIV_Schieflage 0 "Fahrzeug_gerade" 1 "Fahrzeug_in_Schieflage"; -VAL_ 967 MO_Zustand_HWP 0 "HWP_nicht_schaltbar" 1 "HWP_foerdert_nicht" 2 "HWP_foerdert" 3 "reserviert"; -VAL_ 967 OLEV_Systemstoerung 0 "֬system i.O." 1 "Systemstörung ֬system"; -VAL_ 967 MO_Oelwarnung_max 0 "keine_Warnung" 1 "Warnfall_aktiv"; -VAL_ 967 WIV_Oelsystem_aktiv 0 "Anzeige_aus" 1 "Anzeige_aktiv"; -VAL_ 967 WIV_nicht_betriebswarm 0 "Motor_warm" 1 "Motor_nicht_betriebswarm"; -VAL_ 967 WIV_Ueberfuell_Warn 0 "in_Ordnung" 1 "Ueberfuellwarnung"; -VAL_ 967 WIV_laufender_Motor 0 "Messung_moeglich" 1 "Messung_nicht_moeglich"; -VAL_ 967 MO_E_Warnungen 0 "keine_Anzeige" 1 "Fehler_Elektrosystem_Anhalten" 2 "Fehler_Elektrosystem_Werkstatt" 3 "Elektrosystem_ueberhitzt_Stopp" 4 "Fehler_Hybridsystem_Anhalten" 5 "Fehler_Hybridsystem_Werkstatt" 6 "Fehler_Wasserstoffsystem_Anhalte" 7 "Fehler_Wasserstoffsystem_Werksta" 8 "reserviert_keine_Anzeige" 9 "reserviert_keine_Anzeige" 10 "reserviert_keine_Anzeige" 11 "reserviert_keine_Anzeige" 12 "reserviert_keine_Anzeige" 13 "reserviert_keine_Anzeige" 14 "reserviert_keine_Anzeige" 15 "reserviert_keine_Anzeige"; -VAL_ 967 MO_Text_Motorstart 0 "keine_Anzeige" 1 "Motor_im_Stoppbetrieb" 2 "StartStopp_sicherheitsbedingt_deaktiviert" 3 "System_fordert_Wiederstart" 4 "Aufforderung_Motorstart" 5 "Motorlauf_noetig" 6 "Motorlaufwarnung" 9 "Unerwuenschter_Motorstillstand" 10 "Motorstart_nicht_moeglich" 11 "Fehler_Kupplungsschalter" 12 "Motor_startet" 13 "Kupplung_betaetigen" 14 "Waehlhebel_in_PN_Position" 15 "Bremse_treten"; -VAL_ 967 MO_E_Texte 0 "keine_Anzeige" 1 "Batterie_fast_leer" 2 "Ladestecker_nicht_fahrbereit" 3 "VM_Betrieb_erforderlich" 4 "Batterie_laedt_Nicht_ausschalten" 5 "Bitte_Bremse_treten" 6 "manueller_Neustart_erforderlich" 7 "Stopp_Fahrzeug_nicht_abschleppen" 8 "kein_Neustart_Haube_nicht_oeffnen" 9 "Motorstart_im_naechsten_Zyklus" 10 "VM_erforderlich_EVMode_abwaehlen" 11 "laengerer_VMBetrieb_Bordbuch" 12 "Tank_leer_VM_nicht_verfuegbar" 13 "Bitte_warten_Motor_startet" 14 "kein_Start_Batterietemperatur" 15 "Ende_elektrische_Reichweite_erreicht"; -VAL_ 967 WIV_Oeldyn_avl 0 "Oeldyn_nicht_vorhanden" 1 "Oeldyn_vorhanden"; -VAL_ 967 OLEV_Oelstand_nicht_vorhanden 0 "֬stand vorhanden" 1 "֬stand nicht vorhanden"; -VAL_ 967 MO_Systemlampe 0 "Lampe aus" 1 "Lampe ein"; -VAL_ 967 MO_OBD2_Lampe 0 "Lampe aus" 1 "Lampe ein"; -VAL_ 967 MO_Heissleuchte 0 "Lampe aus" 1 "Lampe ein"; -VAL_ 967 MO_Partikel_Lampe 0 "Lampe aus" 1 "Lampe ein"; -VAL_ 967 MO_RedFahrleistung_Lampe 0 "Lampe_aus" 1 "Lampe_ein"; -VAL_ 967 WIV_Oelstand_nicht_vorhanden 0 "֬stand vorhanden" 1 "֬stand nicht vorhanden"; -VAL_ 967 WIV_nachfuellanzeige_ein 0 "keine_Nachfuellanzeige" 1 "Nachfuellanzeige"; -VAL_ 967 WIV_Ueberfuell_deaktiv 0 "Ueberfuellwarnung_am_Kombi_aktiv" 1 "Ueberfuellwarnung_am_Kombi_deaktiv"; -VAL_ 967 WIV_Unterfuell_Warn 0 "in_Ordnung" 1 "Unterfuellwarnung"; -VAL_ 967 MO_Tankdeckel_Lampe 0 "Lampe aus" 1 "Lampe ein"; -VAL_ 967 MO_Text_Tankdeckelwarn 0 "kein_Text" 1 "Anzeige_Text_Tankdeckelwarnung_im_Kombi"; -VAL_ 967 MO_Vorglueh_Lampe 0 "Lampe_aus" 1 "Lampe_ein"; -VAL_ 967 WIV_Oeldr_Warn_Motor 0 "keine_Warnung" 1 "niedrige_Oeldruckstufe_nicht_erreicht"; -VAL_ 967 MO_E_Mode 0 "keine_Anzeige" 1 "E_Mode_passiv" 2 "E_Mode_aktiv" 3 "E_Mode_inaktiv_nicht_verfuegbar" 4 "E_Mode_aktiv_nicht_verfuegbar" 5 "reserviert_keine_Anzeige" 6 "reserviert_keine_Anzeige" 7 "reserviert_keine_Anzeige"; -VAL_ 974 HFS_Tuer_geoeffnet 0 "geschlossen" 1 "offen"; -VAL_ 974 HFS_verriegelt 0 "nicht_verriegelt" 1 "verriegelt"; -VAL_ 974 HFS_gesafet 0 "nicht_gesafet" 1 "gesafet"; -VAL_ 974 HFS_Heckrollotaster_betaetigt 0 "keine_Verfahranweisung_in_Richtung_Hoch" 1 "In_Richtung_Hoch_Verfahren"; -VAL_ 974 HFS_Tuerschloss_defekt 0 "Tuerschloss_funktionsfaehig" 1 "Tuerschloss_defekt"; -VAL_ 974 HFS_Unlock_Taster 0 "nicht_betaetigt" 1 "betaetigt"; -VAL_ 974 HFS_Lock_Taster 0 "nicht_betaetigt" 1 "betaetigt"; -VAL_ 974 HFS_Sperrklinke 0 "Schloss_in_Vorraste_und_Hauptraste" 1 "Tuer_auf_oder_Tuer_Position_zwischen_Vor_und_Hauptraste"; -VAL_ 974 HFS_TAG_betaetigt 0 "nicht_betaetigt" 1 "betaetigt"; -VAL_ 974 HFS_TIG_betaetigt 0 "nicht_betaetigt" 1 "betaetigt"; -VAL_ 974 HFS_FH_S_HBFS_AutoHoch 0 "keine_Bedienung" 1 "Automatiklauf_Angefordert"; -VAL_ 974 HFS_FH_S_HBFS_AutoTief 0 "keine_Bedienung" 1 "Automatiklauf_Angefordert"; -VAL_ 974 HFS_FH_S_HBFS_ManHoch 0 "keine_Bedienung" 1 "Manueller_Lauf_Angefordert"; -VAL_ 974 HFS_FH_S_HBFS_ManTief 0 "keine_Bedienung" 1 "Manueller_Lauf_Angefordert"; -VAL_ 974 HFS_Tuer_Status 0 "Init" 1 "Tuer_geschlossen" 2 "Tuer_offen" 3 "Fehler"; -VAL_ 974 HFS_SAD_Schalter 0 "nicht_betaetigt" 5 "AUF_manuell" 6 "AUF_automatik" 7 "ZU_manuell" 8 "ZU_automatik" 13 "nicht_verfuegbar" 14 "Init" 15 "Fehler"; -VAL_ 974 HFS_FH_S_ManHoch 0 "nicht_betaetigt" 1 "betaetigt"; -VAL_ 974 HFS_FH_S_AutoHoch 0 "nicht_betaetigt" 1 "betaetigt"; -VAL_ 974 HFS_FH_S_ManTief 0 "nicht_betaetigt" 1 "betaetigt"; -VAL_ 974 HFS_FH_S_AutoTief 0 "nicht_betaetigt" 1 "betaetigt"; -VAL_ 974 HFS_FH_Bew_hoch 0 "inaktiv" 1 "aktiv"; -VAL_ 974 HFS_FH_Bew_tief 0 "inaktiv" 1 "aktiv"; -VAL_ 974 HFS_FH_Fang 0 "ausserhalb_Fangbereich" 1 "innerhalb_Fangbereich"; -VAL_ 974 HFS_FH_Block 0 "inaktiv" 1 "aktiv"; -VAL_ 974 HFS_FH_Thermo 0 "inaktiv" 1 "aktiv"; -VAL_ 974 HFS_UEKB_aktiviert 0 "inaktiv" 1 "aktiv"; -VAL_ 974 HFS_Tueroeffnen_Warnung 0 "Tuerwarnung_nicht_aktiv" 1 "Tuerwarnung_aktiv"; -VAL_ 974 HFS_FH_normiert 0 "inaktiv" 1 "aktiv"; -VAL_ 974 ASW_Warnung_aktiv_HFS 0 "nicht_angefordert" 1 "angefordert"; -VAL_ 974 HFS_Zuziehhilfe_aktiv 0 "Init" 1 "Zuziehhilfe_aktiv"; -VAL_ 974 HFS_Seitenrollo_hoch 1 "Seitenrollo_in_Bewegung_hoch"; -VAL_ 974 HFS_Seitenrollo_tief 1 "Seitenrollo_in_Bewegung_tief"; -VAL_ 974 HFS_Status_KiSi 0 "inaktiv" 1 "aktiv"; -VAL_ 974 SSR_HFS_Pos_Unten 0 "SSR_Oben" 1 "SSR_Unten"; -VAL_ 974 HFS_Oben_Block_erw 0 "Fensterheber_nicht_in_Blockerwar" 1 "Fensterheber_in_Blockerwartung_o"; -VAL_ 974 HFS_Unten_Block_erw 0 "Fensterheber_nicht_in_Blockerwar" 1 "Fensterheber_in_Blockerwartung_u"; -VAL_ 974 MTHFS_M_Taste 0 "nicht_betaetigt" 1 "betaetigt"; -VAL_ 974 MTHFS_Pos1 0 "nicht_betaetigt" 1 "betaetigt"; -VAL_ 974 MTHFS_Pos2 0 "nicht_betaetigt" 1 "betaetigt"; -VAL_ 974 MTHFS_Pos3 0 "nicht_betaetigt" 1 "betaetigt"; -VAL_ 974 HFS_MRollo_Schalter 0 "nicht_betaetigt" 1 "ZU_manuell" 2 "ZU_automatik" 3 "AUF_manuell" 4 "AUF_automatik" 5 "nicht_verfuegbar" 6 "Init" 7 "Fehler"; -VAL_ 974 HFS_Lock_Taster_inv 0 "Lock Taster bet䴧it" 1 "Lock Taster nicht bet䴩gt"; -VAL_ 974 HFS_Status_eTAG 0 "Init" 1 "Griff_ausgefahren" 2 "Griff_eingefahren" 3 "Fehler"; -VAL_ 974 HFS_Tuer_Status_QBit 0 "Status_Tuerkontakt_sicher" 1 "Status_Tuerkontakt_unsicher"; -VAL_ 974 HFS_TCR_Mode_aktiv 0 "TCR_Mode_deaktiv" 1 "TCR_Mode_aktiv"; -VAL_ 975 HBFS_Tuer_geoeffnet 0 "geschlossen" 1 "offen"; -VAL_ 975 HBFS_verriegelt 0 "nicht_verriegelt" 1 "verriegelt"; -VAL_ 975 HBFS_gesafet 0 "nicht_gesafet" 1 "gesafet"; -VAL_ 975 HBFS_Heckrollotaster_betaetigt 0 "keine_Verfahranweisung_in_Richtung_Hoch" 1 "In_Richtung_Hoch_Verfahren"; -VAL_ 975 HBFS_Tuerschloss_defekt 0 "Tuerschloss_funktionsfaehig" 1 "Tuerschloss_defekt"; -VAL_ 975 HBFS_Unlock_Taster 0 "nicht_betaetigt" 1 "betaetigt"; -VAL_ 975 HBFS_Lock_Taster 0 "nicht_betaetigt" 1 "betaetigt"; -VAL_ 975 HBFS_Sperrklinke 0 "Schloss_in_Vorraste_und_Hauptraste" 1 "Tuer_auf_oder_Tuer_Position_zwischen_Vor_und_Hauptraste"; -VAL_ 975 HBFS_TAG_betaetigt 0 "nicht_betaetigt" 1 "betaetigt"; -VAL_ 975 HBFS_TIG_betaetigt 0 "nicht_betaetigt" 1 "betaetigt"; -VAL_ 975 HBFS_FH_S_HFS_AutoHoch 0 "keine_Bedienung" 1 "Automatiklauf_Angefordert"; -VAL_ 975 HBFS_FH_S_HFS_AutoTief 0 "keine_Bedienung" 1 "Automatiklauf_Angefordert"; -VAL_ 975 HBFS_FH_S_HFS_ManHoch 0 "keine_Bedienung" 1 "Manueller_Lauf_Angefordert"; -VAL_ 975 HBFS_FH_S_HFS_ManTief 0 "keine_Bedienung" 1 "Manueller_Lauf_Angefordert"; -VAL_ 975 HBFS_Tuer_Status 0 "Init" 1 "Tuer_geschlossen" 2 "Tuer_offen" 3 "Fehler"; -VAL_ 975 HBFS_SAD_Schalter 0 "nicht_betaetigt" 5 "AUF_manuell" 6 "AUF_automatik" 7 "ZU_manuell" 8 "ZU_automatik" 13 "nicht_verfuegbar" 14 "Init" 15 "Fehler"; -VAL_ 975 HBFS_FH_S_ManHoch 0 "nicht_betaetigt" 1 "betaetigt"; -VAL_ 975 HBFS_FH_S_AutoHoch 0 "nicht_betaetigt" 1 "betaetigt"; -VAL_ 975 HBFS_FH_S_ManTief 0 "nicht_betaetigt" 1 "betaetigt"; -VAL_ 975 HBFS_FH_S_AutoTief 0 "nicht_betaetigt" 1 "betaetigt"; -VAL_ 975 HBFS_FH_Bew_hoch 0 "inaktiv" 1 "aktiv"; -VAL_ 975 HBFS_FH_Bew_tief 0 "inaktiv" 1 "aktiv"; -VAL_ 975 HBFS_FH_Fang 0 "ausserhalb_Fangbereich" 1 "innerhalb_Fangbereich"; -VAL_ 975 HBFS_FH_Block 0 "inaktiv" 1 "aktiv"; -VAL_ 975 HBFS_FH_Thermo 0 "inaktiv" 1 "aktiv"; -VAL_ 975 HBFS_UEKB_aktiviert 0 "inaktiv" 1 "aktiv"; -VAL_ 975 HBFS_Tueroeffnen_Warnung 0 "Tuerwarnung_nicht_aktiv" 1 "Tuerwarnung_aktiv"; -VAL_ 975 HBFS_FH_normiert 0 "inaktiv" 1 "aktiv"; -VAL_ 975 ASW_Warnung_aktiv_HBFS 0 "nicht_angefordert" 1 "angefordert"; -VAL_ 975 HBFS_Zuziehhilfe_aktiv 0 "Init" 1 "Zuziehhilfe_aktiv"; -VAL_ 975 HBFS_Seitenrollo_hoch 1 "Seitenrollo_in_Bewegung_hoch"; -VAL_ 975 HBFS_Seitenrollo_tief 1 "Seitenrollo_in_Bewegung_tief"; -VAL_ 975 HBFS_Status_KiSi 0 "inaktiv" 1 "aktiv"; -VAL_ 975 SSR_HBFS_Pos_Unten 0 "SSR_Oben" 1 "SSR_Unten"; -VAL_ 975 HBFS_Oben_Block_erw 0 "Fensterheber_nicht_in_Blockerwar" 1 "Fensterheber_in_Blockerwartung_o"; -VAL_ 975 HBFS_Unten_Block_erw 0 "Fensterheber_nicht_in_Blockerwar" 1 "Fensterheber_in_Blockerwartung_u"; -VAL_ 975 MTHBFS_M_Taste 0 "nicht_betaetigt" 1 "betaetigt"; -VAL_ 975 MTHBFS_Pos1 0 "nicht_betaetigt" 1 "betaetigt"; -VAL_ 975 MTHBFS_Pos2 0 "nicht_betaetigt" 1 "betaetigt"; -VAL_ 975 MTHBFS_Pos3 0 "nicht_betaetigt" 1 "betaetigt"; -VAL_ 975 HBFS_MRollo_Schalter 0 "nicht_betaetigt" 1 "ZU_manuell" 2 "ZU_automatik" 3 "AUF_manuell" 4 "AUF_automatik" 5 "nicht_verfuegbar" 6 "Init" 7 "Fehler"; -VAL_ 975 HBFS_Lock_Taster_inv 0 "Lock Taster bet䴧it" 1 "Lock Taster nicht bet䴩gt"; -VAL_ 975 HBFS_Status_KiSi_inv 0 "aktiv" 1 "inaktiv"; -VAL_ 975 HBFS_Status_eTAG 0 "Init" 1 "Griff_ausgefahren" 2 "Griff_eingefahren" 3 "Fehler"; -VAL_ 975 HBFS_Tuer_Status_QBit 0 "Status_Tuerkontakt_sicher" 1 "Status_Tuerkontakt_unsicher"; -VAL_ 975 HBFS_TIG_betaetigt_schliessen 0 "nicht_betaetigt" 1 "betaetigt"; -VAL_ 976 FT_Tuer_geoeffnet 0 "Init" 1 "Tuer offen"; -VAL_ 976 FT_verriegelt 0 "Init" 1 "verriegelt"; -VAL_ 976 FT_gesafet 0 "Init" 1 "gesafet"; -VAL_ 976 FT_Schluesselschalter_auf 0 "Init" 1 "Schluesselschalter_auf_betaetigt"; -VAL_ 976 FT_Schluesselschalter_zu 1 "Schluesselschalter zu betaetigt"; -VAL_ 976 FT_Unlock_Taster 0 "Init" 1 "Unlock_Taster_betaetigt"; -VAL_ 976 FT_Lock_Taster 0 "Init" 1 "Lock_Taster_betaetigt"; -VAL_ 976 FT_Sperrklinke 0 "Schloss_in_Vorraste_und_Hauptraste" 1 "Tuer_auf_oder_Tuer_Position_zwischen_Vor_und_Hauptraste"; -VAL_ 976 FT_TAG_betaetigt 0 "nicht_betaetigt" 1 "betaetigt"; -VAL_ 976 FT_TIG_betaetigt 0 "nicht_betaetigt" 1 "betaetigt"; -VAL_ 976 FT_IRUE_Taste 0 "Init" 1 "IRUE_Taste_betaetigt"; -VAL_ 976 FT_HD_Taste 0 "Init" 1 "Heckdeckel_oeffnen"; -VAL_ 976 FT_TD_Taste_Fehler 0 "iO" 1 "defekt"; -VAL_ 976 FT_TD_Taste 1 "Tankdeckelentriegelungs Taster gedrückt"; -VAL_ 976 SSR_Temp_Freigabe 0 "SSR_Deaktiviert" 1 "SSR_Freigegeben"; -VAL_ 976 FT_HD_Taste_2 0 "Taste_nicht_gedrueckt" 1 "Taste_gedrueckt"; -VAL_ 976 FT_TSG_hinten_verbaut 0 "nicht verbaut" 1 "verbaut"; -VAL_ 976 FT_Sp_Blk_def 0 "iO" 1 "defekt"; -VAL_ 976 FT_FH_S_ManHoch 0 "Init" 1 "FH_Schalter_man_hoch_betaetigt"; -VAL_ 976 FT_FH_S_AutoHoch 0 "Init" 1 "FH_Schalter_auto_hoch_betaetigt"; -VAL_ 976 FT_FH_S_ManTief 0 "Init" 1 "FH_Schalter_man_tief_betaetigt"; -VAL_ 976 FT_FH_S_AutoTief 0 "Init" 1 "FH_Schalter_auto_tief_betaetigt"; -VAL_ 976 FT_FH_Bew_hoch 0 "Init" 1 "FH_in_Bewegung_hoch"; -VAL_ 976 FT_FH_Bew_tief 0 "Init" 1 "FH_in_Bewegung_tief"; -VAL_ 976 FT_FH_Fang 0 "ausserhalb_Fangbereich" 1 "innerhalb_Fangbereich"; -VAL_ 976 FT_FH_Block 0 "Init" 1 "Fenster_Block"; -VAL_ 976 FT_FH_Thermo 0 "Init" 1 "Thermoschutz_aktiv"; -VAL_ 976 FT_UEKB_aktiviert 0 "Init" 1 "UEKB_aktiv"; -VAL_ 976 ASW_HMI_defekt 0 "iO" 1 "defekt"; -VAL_ 976 FT_FH_normiert 0 "Init" 1 "Fenster_normiert"; -VAL_ 976 FT_Schliesstaster 1 "Schliesstaster_betaetigt"; -VAL_ 976 FT_Zuziehhilfe_aktiv 0 "Init" 1 "Zuziehilfe_aktiv"; -VAL_ 976 FT_SP_ausgerastet 0 "Init" 1 "Spiegel_ausgerastet"; -VAL_ 976 FT_SP_lr_aktiv 0 "Init" 1 "Spiegel_xAchse_aktiv"; -VAL_ 976 FT_SP_ht_aktiv 0 "Init" 1 "Spiegel_yAchse_aktiv"; -VAL_ 976 ASW_wakeup 0 "Sleep" 1 "Wakeup"; -VAL_ 976 FT_Oben_Block_erw 0 "Fensterheber_nicht_in_Blockerwar" 1 "Fensterheber_in_Blockerwartung_o"; -VAL_ 976 FT_Unten_Block_erw 0 "Fensterheber_nicht_in_Blockerwar" 1 "Fensterheber_in_Blockerwartung_u"; -VAL_ 976 FT_Kisi_li_aktiv 0 "inaktiv" 1 "aktiv"; -VAL_ 976 FT_Kisi_re_aktiv 0 "inaktiv" 1 "aktiv"; -VAL_ 976 FT_Kisi_Taster_li 0 "nicht_betaetigt" 1 "betaetigt"; -VAL_ 976 FT_Kisi_Taster_re 0 "nicht_betaetigt" 1 "betaetigt"; -VAL_ 976 FT_BFS_Fond_Freigabe 0 "Init" 1 "Freigabe_fuer_Fondbedienung_BFS"; -VAL_ 976 FT_Kisi_Fehler 0 "kein_Fehler" 1 "Fehler"; -VAL_ 976 FT_Daemmglas 0 "Normalglas_verbaut" 1 "Daemmglas_verbaut"; -VAL_ 976 FT_SP_Heizung_Status 0 "Init" 1 "Status_Spiegelheizung_ein"; -VAL_ 976 ASW_Warnung_aktiv_FS 0 "nicht_angefordert" 1 "angefordert"; -VAL_ 976 FT_FH_Pos_oben 1 "Scheibe oben (nach Absenken auf Position)"; -VAL_ 976 FT_Tuerschloss_defekt 0 "Tuerschloss_funktionsfaehig" 1 "Tuerschloss_defekt"; -VAL_ 976 FT_SWA_Taster 0 "Taster_nicht_betaetigt" 1 "Taster_betaetigt"; -VAL_ 976 SWA_HMI_Diagnose 0 "kein_Fehler_erkannt" 1 "Fehler_Taster_erkannt" 2 "Fehler_LED_erkannt" 3 "Fehler_LED_und_Taster_erkannt"; -VAL_ 976 FS_Status_eTAG 0 "Init" 1 "Griff_ausgefahren" 2 "Griff_eingefahren" 3 "Fehler"; -VAL_ 980 BH_Blinker_li 0 "nicht_betaetigt" 1 "Blinkerhebel_Pos_li_betaetigt"; -VAL_ 980 BH_Blinker_re 0 "nicht_betaetigt" 1 "Blinkerhebel_Pos_re_betaetigt"; -VAL_ 980 BH_Lichthupe 0 "nicht_betaetigt" 1 "Blinkerhebel in Richtung Lichthupe betaetigt"; -VAL_ 980 BH_Fernlicht 0 "nicht_betaetigt" 1 "Blinkerhebel_in_Richtung_Fernlicht_betaetigt"; -VAL_ 980 WH_Tipwischen 0 "nicht_betaetigt" 1 "betaetigt"; -VAL_ 980 WH_Intervall 0 "aus" 1 "Wischerhebel in Stellung Intervall"; -VAL_ 980 WH_WischerStufe1 0 "aus" 1 "Wischerhebel in Stufe Wischen 1"; -VAL_ 980 WH_WischerStufe2 0 "aus" 1 "Wischerhebel in Stufe Wischen 2"; -VAL_ 980 WH_Frontwaschen 0 "aus" 1 "Wischerhebel in Stellung Wisch Wasch vorne"; -VAL_ 980 WH_Heckintervall 0 "nicht_betaetigt" 1 "Wischerhebel in Stellung Heckintervall"; -VAL_ 980 WH_Heckwaschen 0 "nicht_betaetigt" 1 "Wischerhebel in Stellung Wisch Wasch hinten"; -VAL_ 980 WH_Intervallstufen 0 "Init / Default" 1 "Intervallstufe 1" 5 "Intervallstufe 2" 9 "Intervallstufe 3" 13 "Intervallstufe 4" 15 "Fehler"; -VAL_ 980 FAS_Taster 0 "nicht_betaetigt" 1 "betaetigt"; -VAL_ 980 FAS_Taster_Fehler 0 "kein_Fehler" 1 "Fehler"; -VAL_ 980 SMLS_Hupe 0 "nicht_betaetigt" 1 "Hupe_gedrueckt"; -VAL_ 980 LRH_On_Off 0 "LRH_aus__keine Anzeige" 1 "LRH_aus" 2 "LRH_ein" 3 "Fehler"; -VAL_ 980 LRH_aktiv 0 "inaktiv" 1 "aktiv"; -VAL_ 980 SMLS_P_verriegelt_plausibel 0 "unplausibel" 1 "plausibel"; -VAL_ 980 WH_SRA 0 "SRA_Aus" 1 "SRA_Ein"; -VAL_ 980 WH_Wischer_Fehler 0 "kein_Fehler" 1 "Fehler"; -VAL_ 980 BH_Blinker_Fehler 0 "kein_Fehler" 1 "Fehler"; -VAL_ 980 SMLS_PTT 0 "nicht_betaetigt" 1 "PTT_gedrueckt"; -VAL_ 980 WH_Tipwischen_lang 0 "nicht_betaetigt" 1 "betaetigt"; -VAL_ 981 BCM1_Kurvenlicht_links_Anf 0 "linkes_Kurvenlicht/Abbiegelicht_durch_BCM1_nicht_angesteuert" 1 "linkes_Kurven/Abbiegelicht_durch_BCM1_angesteuert"; -VAL_ 981 BCM1_Kurvenlicht_rechts_Anf 0 "rechtes_Kurvenlicht/Abbiegelicht_durch_BCM1_nicht_angesteuert" 1 "rechtes_Kurvenlicht/Abbiegelicht_durch_BCM1_angesteuert"; -VAL_ 981 BCM1_Standlicht_Anf 0 "Licht_nicht_angefordert" 1 "Licht ist einzuschalten"; -VAL_ 981 BCM1_Abblendlicht_Anf 0 "Licht_nicht_angefordert" 1 "Licht ist einzuschalten"; -VAL_ 981 BCM1_Fernlicht_Anf 0 "Licht_nicht_angefordert" 1 "Licht ist einzuschalten"; -VAL_ 981 BCM1_Nebellicht_Anf 0 "Licht_nicht_angefordert" 1 "Licht ist einzuschalten"; -VAL_ 981 BCM1_Parklicht_li_Anf 0 "Licht_nicht_angefordert" 1 "Licht ist einzuschalten"; -VAL_ 981 BCM1_Parklicht_re_Anf 0 "Licht_nicht_angefordert" 1 "Licht ist einzuschalten"; -VAL_ 981 BCM1_Nebelschluss_Ahg_Anf 0 "Licht_nicht_angefordert" 1 "Licht ist einzuschalten"; -VAL_ 981 BCM1_Nebelschluss_Fzg_Anf 0 "Licht_nicht_angefordert" 1 "Licht ist einzuschalten"; -VAL_ 981 BCM1_Schlusslicht_Anf 0 "Licht_nicht_angefordert" 1 "Licht ist einzuschalten"; -VAL_ 981 BCM_Rueckfahrlicht_Anf 0 "Licht_nicht_angefordert" 1 "Licht_angefordert"; -VAL_ 981 BCM1_Signaturlicht_Anf 0 "Licht_nicht_angefordert" 1 "Licht_ist_einzuschalten"; -VAL_ 981 BCM1_Umfeldleuchten_Anf 0 "Licht_nicht_angefordert" 1 "Licht_ist_einzuschalten"; -VAL_ 981 BCM1_Tagfahrlicht_Anf 0 "Licht_nicht_angefordert" 1 "Licht ist einzuschalten"; -VAL_ 981 BCM1_Regenlicht_Anf 0 "Licht_nicht_angefordert" 1 "Licht ist einzuschalten"; -VAL_ 981 BCM1_Autobahnlicht_Anf 0 "Licht_nicht_angefordert" 1 "Licht ist einzuschalten"; -VAL_ 981 BCM1_Touristen_Licht_Anf 0 "Licht_nicht_angefordert" 1 "Anforderung von Touristenlicht"; -VAL_ 981 BCM1_CH_aktiv 0 "Inaktiv" 1 "Aktiv"; -VAL_ 981 BCM1_LH_aktiv 0 "Inaktiv" 1 "Aktiv"; -VAL_ 981 BCM1_Gleitende_Leuchtw_Anf 0 "Aus" 1 "Ein"; -VAL_ 981 BCM1_GLW_Fernlicht_Anf 0 "Aus" 1 "Ein"; -VAL_ 981 BCM1_Adaptive_Lichtvert_Anf 0 "Aus" 1 "Ein"; -VAL_ 981 BCM1_FoD_Sperrung_WiBli 0 "Freigabe_WiBli" 1 "Sperrung_WiBli" 2 "Init"; -VAL_ 981 BCM1_FOD_Sperrung_Animationen_HL 0 "Freigabe_Animationen" 1 "Sperrung_Animationen" 2 "Init"; -VAL_ 981 BCM1_Animationssperrung 0 "keine_Sperrung" 1 "Sperrung"; -VAL_ 981 BCM1_CH_LH_aktiv 0 "Comming_Home_Bzw._Leaving_Home_nicht_aktiv" 1 "Comming Home bzw. Leaving Home aktiv"; -VAL_ 981 BCM1_Allwetterlicht_Anf 0 "Licht_nicht_angefordert" 1 "Licht_ist_einzuschalten"; -VAL_ 981 BCM1_Schlusslicht_Signatur 0 "keine_Signatur" 1 "Signatur_1" 2 "Signatur_2" 3 "Signatur_3" 4 "Signatur_4" 5 "Signatur_5" 6 "Signatur_6" 7 "Signatur_7" 8 "Signatur_8" 9 "Signatur_9" 10 "Signatur_10" 11 "Signatur_11" 12 "Signatur_12" 13 "Signatur_13" 14 "Signatur_14" 15 "Signatur_15"; -VAL_ 982 BCM2_Bremsl_durch_ECD 0 "Bremslicht_ist_aus" 1 "Bremslicht_durch_ECD_aktiv"; -VAL_ 982 LH_Aussenlicht_def 0 "OK" 1 "defekt"; -VAL_ 982 LH_Standlicht_H_aktiv 1 "Standlicht hinten aktiv"; -VAL_ 982 LH_Parklicht_HL_aktiv 0 "nicht aktiv" 1 "Parklicht hinten links aktiv"; -VAL_ 982 LH_Parklicht_HR_aktiv 0 "nicht aktiv" 1 "Parklicht hinten rechts aktiv"; -VAL_ 982 LH_Bremslicht_H_aktiv 1 "Bremslicht hinten aktiv"; -VAL_ 982 LH_Nebelschluss_aktiv 0 "nicht aktiv" 1 "aktiv"; -VAL_ 982 LH_Rueckfahrlicht_aktiv 0 "nicht aktiv" 1 "aktiv"; -VAL_ 982 LH_Blinker_HL_akt 1 "Blinker hinten links aktiv"; -VAL_ 982 LH_Blinker_HR_akt 1 "Blinker hinten rechts aktiv"; -VAL_ 982 LH_Blinker_li_def 0 "OK" 1 "Blinker hinten links defekt"; -VAL_ 982 LH_Bremsl_li_def 0 "OK" 1 "mindestens ein Bremslicht hinten links defekt"; -VAL_ 982 LH_Schlusslicht_li_def 0 "OK" 1 "mindestens ein Schlusslicht hinten links defekt"; -VAL_ 982 LH_Rueckf_li_def 0 "OK" 1 "Rückfahrlicht hinten links defekt"; -VAL_ 982 LH_Nebel_li_def 0 "OK" 1 "Nebelschlusslicht hinten links defekt"; -VAL_ 982 LH_Schluss_Brems_Nebel_li_def 0 "iO" 1 "defekt"; -VAL_ 982 LH_Schluss_Brems_Nebel_re_def 0 "iO" 1 "defekt"; -VAL_ 982 LH_Zusatzschlussl_def 0 "OK" 1 "mindestens_ein_Zusatzschlusslicht_defekt"; -VAL_ 982 LH_Schluss_Brems_li_def 0 "OK" 1 "defekt"; -VAL_ 982 LH_Schluss_Nebel_li_def 0 "OK" 1 "defekt"; -VAL_ 982 LH_SL_BRL_BLK_li_def 0 "OK" 1 "defekt"; -VAL_ 982 LH_Brems_Blk_li_def 0 "OK" 1 "defekt"; -VAL_ 982 LH_Diag_Status_re_def 0 "OK" 1 "Aussenlict_Diagnose_Systemstoerung_rechts"; -VAL_ 982 LH_Diag_Status_li_def 0 "OK" 1 "Aussenlicht_Diagnose_Systemstoerung_links"; -VAL_ 982 LH_Diag_LED_li_def 0 "OK" 1 "Heckleuchte_links_defekt"; -VAL_ 982 LH_Diag_LED_re_def 0 "OK" 1 "Heckleuchte_rechts_defekt"; -VAL_ 982 LH_Blinker_re_def 0 "OK" 1 "Blinker hinten rechts defekt"; -VAL_ 982 LH_Bremsl_re_def 0 "OK" 1 "mindestens ein Bremslicht hinten rechts defekt"; -VAL_ 982 LH_Schlusslicht_re_def 0 "OK" 1 "mindestens ein Schlusslicht hinten rechts defekt"; -VAL_ 982 LH_Rueckf_re_def 0 "OK" 1 "Rückfahrlicht hinten rechts defekt"; -VAL_ 982 LH_Nebel_re_def 0 "OK" 1 "Nebelschlusslicht hinten rechts defekt"; -VAL_ 982 LH_Schluss_Brems_mi_def 0 "OK" 1 "Defekt"; -VAL_ 982 LH_Schluss_Brems_re_def 0 "OK" 1 "defekt"; -VAL_ 982 LH_Schluss_Nebel_re_def 0 "OK" 1 "defekt"; -VAL_ 982 LH_SL_BRL_BLK_re_def 0 "OK" 1 "defekt"; -VAL_ 982 LH_Brems_Blk_re_def 0 "OK" 1 "defekt"; -VAL_ 982 LH_Kennzl_def 0 "OK" 1 "Kennzeichenbeleuchtung hinten defekt"; -VAL_ 982 LH_3_Bremsl_def 0 "OK" 1 "hochgesetzte Bremsleuchte defekt"; -VAL_ 982 LH_Nebel_mi_def 0 "OK" 1 "Nebelschlusslicht hinten Mitte defekt"; -VAL_ 982 LH_Rueckf_mi_def 0 "OK" 1 "Rückfahllicht Mitte defekt"; -VAL_ 982 LH_Schlusslicht_mi_def 0 "OK" 1 "defekt"; -VAL_ 982 LH_Bremsl_mi_def 0 "OK" 1 "defekt"; -VAL_ 982 LH_Bremsl_li_ges_def 0 "OK" 1 "Alle Bremslichter hinten links defekt"; -VAL_ 982 LH_Bremsl_re_ges_def 0 "OK" 1 "Alle Bremslichter hinten rechts defekt"; -VAL_ 988 EPB_Status 0 "offen" 1 "geschlossen_Parken" 2 "teilgespannt_Halten" 3 "im_Lauf_oeffnen" 4 "im_Lauf_schliessen" 5 "tbd" 6 "Init" 7 "unbekannt"; -VAL_ 988 GE_Fahrstufe 0 "Zwischenstellung" 1 "Init" 5 "P" 6 "R" 7 "N" 8 "D" 9 "D" 10 "E" 13 "T" 14 "T" 15 "Fehler"; -VAL_ 997 FT_Tuer_Status 0 "Init" 1 "Tuer_geschlossen" 2 "Tuer_offen" 3 "Fehler"; -VAL_ 997 FT_Tuer_Status_QBit 0 "Status_Tuerkontakt_sicher" 1 "Status_Tuerkontakt_unsicher"; -VAL_ 997 FT_Lock_Taster_02 0 "nicht_betaetigt" 1 "betaetigt"; -VAL_ 997 FT_Schluesselschalter_zu_02 0 "nicht_betaetigt" 1 "betaetigt"; -VAL_ 997 FT_BFS_Tuer_Status 0 "Init" 1 "Tuer_geschlossen" 2 "Tuer_offen" 3 "Fehler"; -VAL_ 997 FT_HBFS_Tuer_Status 0 "Init" 1 "Tuer_geschlossen" 2 "Tuer_offen" 3 "Fehler"; -VAL_ 997 FT_HFS_Tuer_Status 0 "Init" 1 "Tuer_geschlossen" 2 "Tuer_offen" 3 "Fehler"; -VAL_ 997 FT_Tueroeffnen_Warnung 0 "Tuerwarnung_nicht_aktiv" 1 "Tuerwarnung_aktiv"; -VAL_ 997 FT_SP_Heizung_ein 0 "Aus" 1 "Ein"; -VAL_ 997 FT_Kisi_Taster_li_02 0 "nicht_betaetigt" 1 "betaetigt"; -VAL_ 997 FT_Kisi_Taster_re_02 0 "nicht_betaetigt" 1 "betaetigt"; -VAL_ 997 FT_TD_Taste_Status 0 "kein_Fehler" 1 "Kurzschluss_nach_Minus" 2 "Kurzschluss_nach_Plus" 3 "Leitungsunterbrechung"; -VAL_ 997 FT_TCR_Mode_aktiv 0 "TCR_Mode_deaktiv" 1 "TCR_Mode_aktiv"; -VAL_ 997 FS_Push_Tuergriff 0 "nicht_erkannt" 1 "erkannt"; -VAL_ 1004 TSK_State 0 "init" 1 "disabled" 2 "enabled" 3 "regulating" 4 "accel_pedal_override" 5 "brake_only" 6 "temp_fault" 7 "perm_fault"; -VAL_ 1122 PSD_Segment_ID 0 "keine Segmentinformationen vorhanden" 1 "Fehlerwert"; -VAL_ 1122 PSD_Vorgaenger_Segment_ID 0 "keine Segmentinformation vorhanden" 1 "Fehlerwert"; -VAL_ 1122 PSD_Strassenkategorie 0 "Rest_Feldweg_Schotterweg_Privatweg" 1 "Ortsstraߥ" 2 "Kreisstraߥ" 3 "Landstraߥ" 4 "Bundesstraߥ" 5 "Autobahn" 7 "Init"; -VAL_ 1122 PSD_Endkruemmung 255 "Gerade"; -VAL_ 1122 PSD_Endkruemmung_Vorz 0 "Kruemmung_positiv" 1 "Kruemmung_negativ"; -VAL_ 1122 PSD_Idenditaets_ID 0 "keine_Segment_Informationen_vorhanden" 1 "Fehler"; -VAL_ 1122 PSD_ADAS_Qualitaet 0 "keine_ADAS_Qualitaet" 1 "ADAS_Qualitaet"; -VAL_ 1122 PSD_wahrscheinlichster_Pfad 0 "Pfad_mit_geringer_Wahrscheinlichkeit" 1 "wahrscheinlichster_Pfad"; -VAL_ 1122 PSD_Geradester_Pfad 0 "nicht_geradester_PFad" 1 "geradester_Pfad"; -VAL_ 1122 PSD_Fahrspuren_Anzahl 0 "Einbahnstrasse_in_falsche_Richtung" 1 "eine_Fahrspur" 2 "zwei_Fahrspuren" 3 "drei_Fahrspuren" 4 "vier_Fahrspuren" 5 "fuenf_Fahrspuren" 6 "sechs_Fahrspuren" 7 "mehr_als_sechs_Fahrspuren"; -VAL_ 1122 PSD_Bebauung 0 "ausserhalb_bebauten_Gebietes" 1 "innerhalb_bebauten_Gebietes"; -VAL_ 1122 PSD_Segment_Komplett 0 "Segment_Attribute_nicht_komplett" 1 "Segment_Attribute_komplett"; -VAL_ 1122 PSD_Rampe 0 "Strasse_mit_Gegenverkehr" 1 "Auffahrt_Einbahnstr" 2 "Abfahrt_Einbahnstr" 3 "Einbahnstrasse"; -VAL_ 1122 PSD_Anfangskruemmung 255 "Gerade"; -VAL_ 1122 PSD_Anfangskruemmung_Vorz 0 "positiv" 1 "negativ"; -VAL_ 1122 PSD_Abzweigerichtung 0 "rects_abzweigende_Strasse" 1 "links_abzweigende_Strasse"; -VAL_ 1123 PSD_Pos_Segment_ID 0 "keine Position gegeben" 1 "Fehlerwert"; -VAL_ 1123 PSD_Pos_Standort_Eindeutig 0 "mehrdeutiger_Standort" 1 "eindeutiger_Standort"; -VAL_ 1123 PSD_Pos_Fehler_Laengsrichtung 0 "Init" 1 "< 2m" 2 "< 5m" 3 "< 10m" 4 "< 20m" 5 "< 50m" 6 "> 50m" 7 "Off-Road"; -VAL_ 1123 PSD_Pos_Fahrspur 0 "unbekannt" 1 "Erste_Spur_von_rechts" 2 "Zweite_Spur_von_rechts" 3 "Dritte_Spur_von_rechts" 4 "Vierte_Spur_von_rechts" 5 "Fuenfte_Spur_von_rechts" 6 "Sechte_Spur_von_rechts" 7 "Siebte_oder_weitere_Spur_von_rechts"; -VAL_ 1123 PSD_Attribut_Segment_ID_05 0 "keine_Segment_Information" 1 "Fehler"; -VAL_ 1123 PSD_Attribut_1_ID 0 "keine_Information"; -VAL_ 1123 PSD_Attribut_2_ID 0 "keine_Information"; -VAL_ 1123 PSD_Attribute_Komplett_05 0 "Attribute_nicht_komplett" 1 "Attribute_komplett"; -VAL_ 1124 PSD_06_Mux 0 "Init"; -VAL_ 1124 PSD_Sys_Segment_ID 0 "keine Segmentinformationen vorhanden" 1 "nicht zulaessig"; -VAL_ 1124 PSD_Sys_Geschwindigkeit_Einheit 0 "km/h" 1 "mph"; -VAL_ 1124 PSD_Sys_Verkehrsrichtung 0 "Rechtsverkehr" 1 "Linksverkehr"; -VAL_ 1124 PSD_Sys_Geometrieguete 0 "Geringe_Guete" 1 "tbd" 2 "tbd" 3 "Hohe_Guete"; -VAL_ 1124 PSD_Sys_Mapmatchingguete 0 "geringe_Guete" 1 "res" 2 "res" 3 "hohe_Guete"; -VAL_ 1124 PSD_Sys_Alter_Karte 0 "kleiner_1_Jahr" 1 "1_Jahr" 2 "2_Jahre" 3 "3_Jahre" 4 "4_Jahre" 5 "5_Jahre" 6 "6_Jahre" 7 "groesser_7_Jahre"; -VAL_ 1124 PSD_Sys_Zielfuehrung 0 "Zielfuehrung nicht aktiv" 1 "Zielfuehrung aktiv"; -VAL_ 1124 PSD_Sys_US_State 0 "kein_US_State" 1 "Alabama" 2 "Alaska" 3 "Arkansas" 4 "Arizona" 5 "California" 6 "Colorado" 7 "Conneticut" 8 "District_of_Columbia" 9 "Delaware" 10 "Florida" 11 "Georgia" 12 "Hawaii" 13 "Idaho" 14 "Illinois" 15 "Iowa" 16 "Indiana" 17 "Kansas" 18 "Kentucky" 19 "Louisiana" 20 "Massachusetts" 21 "Maryland" 22 "Maine" 23 "Michigan" 24 "Minnesota" 25 "Missouri" 26 "Mississippi" 27 "Montana" 28 "North_Carolina" 29 "North_Dakota" 30 "Nebraska" 31 "Nevada" 32 "New_Hampshire" 33 "New_Jersey" 34 "New_Mexico" 35 "New_York" 36 "Ohio" 37 "Oklahoma" 38 "Oregon" 39 "Pennsylvania" 40 "Puerto_Rico" 41 "Rhode_Island" 42 "South_Carolina" 43 "South_Dakota" 44 "Tennessee" 45 "Texas" 46 "Utah" 47 "Virginia" 48 "Virgin_Islands" 49 "Vermont" 50 "Washington" 51 "Wisconsin" 52 "West_Virginia" 53 "Wyoming"; -VAL_ 1124 PSD_Sys_Quali_verfuegbar 0 "Qualitaetskriterien_nicht_verfuegbar" 1 "Qualitaetskriterien_verfuegbar"; -VAL_ 1124 PSD_Sys_Zielfuehrung_geaendert 0 "Zielfuehrung_nicht_geaendert" 1 "Zielfuehrung_geaendert"; -VAL_ 1124 PSD_Sys_Geometrieguete_erweitert 0 "Init"; -VAL_ 1124 PSD_Attribut_Segment_ID 0 "keine_Segment_Information_vorhanden" 1 "Fehler"; -VAL_ 1124 PSD_Attribut_3_ID 0 "keine_Information"; -VAL_ 1124 PSD_Attribut_4_ID 0 "keine_Information"; -VAL_ 1124 PSD_Attribut_5_ID 0 "keine_Information"; -VAL_ 1124 PSD_Attribute_Komplett_06 0 "Attribute_nicht_komplett" 1 "Attribute_komplett"; -VAL_ 1124 PSD_Ges_Segment_ID 0 "keine Segmentinformationen vorhanden" 1 "nicht zulaessig"; -VAL_ 1124 PSD_Ges_Geschwindigkeit 0 "Kein Geschwindigkeitsgebot" 1 "0 km/h < v_max < 5 km/h" 2 "5 km/h < v_max < 10km/h" 3 "10 km/h < v_max < 15 km/h" 4 "15 km/h < v_max < 20 km/h" 5 "20 km/h < v_max < 25 km/h" 6 "25 km/h < v_max < 30 km/h" 7 "30 km/h < v_max < 35 km/h" 8 "35 km/h < v_max < 40 km/h" 9 "40 km/h < v_max < 45 km/h" 10 "45 km/h < v_max < 50 km/h" 11 "50 km/h < v_max < 60 km/h" 12 "60 km/h < v_max < 70 km/h" 13 "70 km/h < v_max < 80 km/h" 14 "80 km/h < v_max < 90 km/h" 15 "90 km/h < v_max < 100 km/h" 16 "100 km/h < v_max < 110 km/h" 17 "110 km/h < v_max < 120 km/h" 18 "120 km/h < v_max < 130 km/h" 19 "130 km/h < v_max < 140 km/h" 20 "140 km/h < v_max < 150 km/h" 21 "150 km/h < v_max < 160 km/h" 22 "160 km/h < v_max" 23 "Geschwindigkeitsgebot aufgehoben" 24 "..0x1F ungültig"; -VAL_ 1124 PSD_Ges_Typ 0 "Geschw_Klasse_des_Kartendatensuppliers" 1 "Explizit_abgeleiteten_Begrenzung" 2 "Durch_Gesetzg_vorgeg_allgem_Gebot_fuer_uebertr_Rahmenbed" 3 "Init"; -VAL_ 1124 PSD_Ges_Spur_Geschw_Begrenzung 0 "Gebot_fuer_alle_spuren_gueltig"; -VAL_ 1124 PSD_Ges_Geschwindigkeit_Gespann 0 "alle Fahrzeuge" 1 "PKW mit Gespann" 2 "LKW, Busse, etc."; -VAL_ 1124 PSD_Ges_Geschwindigkeit_Witter 0 "Witterungsunabh䮧ig" 1 "N䳳e, Regen, Niederschlag" 2 "Gl䴴e" 3 "Nebel"; -VAL_ 1124 PSD_Ges_Geschwindigkeit_Tag_Anf 0 "kein Beginn definiert" 1 "Montag" 2 "Dienstag" 3 "Mittwoch" 4 "Donnerstag" 5 "Freitag" 6 "Samstag" 7 "Sonntag"; -VAL_ 1124 PSD_Ges_Geschwindigkeit_Tag_Ende 0 "kein Ende definiert" 1 "Montag" 2 "Dienstag" 3 "Mittwoch" 4 "Donnerstag" 5 "Freitag" 6 "Samstag" 7 "Sonntag"; -VAL_ 1124 PSD_Ges_Geschwindigkeit_Std_Anf 25 "kein Beginn für stundenweise Einschr䮫ungen"; -VAL_ 1124 PSD_Ges_Geschwindigkeit_Std_Ende 25 "kein Ende für stundenweise Einschr䮫ungen"; -VAL_ 1124 PSD_Ges_Ueberholverbot 0 "kein ܢerholverbot" 1 "alle Fahrzeuge" 2 "ܢerholverbot für PKW mit Gespann" 3 "ܢerholverbot für LKW, Busse, etc."; -VAL_ 1124 PSD_Ges_Wechselverkehrszeichen 0 "Kein Wechselverkehrszeichen" 1 "Wechselverkehrszeichen links" 2 "Wechselverkehrszeichen rechts" 3 "Wechselverkehrszeichen links und rechts" 4 "Wechselverkerhszeichen über der Fahrbahn"; -VAL_ 1124 PSD_Wechselverkehrszeichen_Typ 0 "kein_Wechselverkehrszeichen" 1 "LED_Wechselverkehrszeichen" 2 "nicht_LED_Wechselverkehrszeichen"; -VAL_ 1124 PSD_Ges_Gesetzlich_Kategorie 0 "kein_legales_Verbot" 1 "innerorts" 2 "ausserorts" 3 "Autobahn"; -VAL_ 1124 PSD_Ges_Gesetzlich_Zusatz 0 "kein_Zusatz_zu_legalem_Gebot" 1 "Anhaenger_Klasse_1" 2 "Anhaenger_Klasse_2"; -VAL_ 1124 PSD_Ges_Verkehrszeichen_Quelle 0 "VZA_kein_Onlinedienst" 1 "nur_VZA" 2 "nur_VZO" 3 "VZA_und_VZO"; -VAL_ 1124 PSD_Ges_Attribute_Komplett 0 "Attribute_nicht_komplett" 1 "Attribute_komplett"; -VAL_ 1124 PSD_Baum_Laenge_VZ 0 "Ost" 1 "West"; -VAL_ 1124 PSD_Baum_Breite_VZ 0 "Nord" 1 "Sued"; -VAL_ 1124 PSD_Steigung_1_Segment_ID 0 "keine_Segment_Information_vorhanden" 1 "Fehler"; -VAL_ 1124 PSD_Steigung_1_A_Steigung 126 "mehr_als_15_Prozent" 127 "Steigung_unbekannt"; -VAL_ 1124 PSD_Steigung_1_A_Vorz 0 "Gefaelle" 1 "Steigung"; -VAL_ 1124 PSD_Steigung_1_B_Steigung 126 "mehr_als_15_Prozent" 127 "Steigung_unbekannt"; -VAL_ 1124 PSD_Steigung_1_B_Vorz 0 "Gefaelle" 1 "Steigung"; -VAL_ 1124 PSD_Steigung_1_Attribute_kompl 0 "Steigungen_nicht_komplett" 1 "Steigungen_komplett"; -VAL_ 1124 PSD_Steigung_2_Segment_ID 0 "keine_Segment_Information_vorhanden" 1 "Fehler"; -VAL_ 1124 PSD_Steigung_2_Steigung 126 "mehr_als_15_Prozent" 127 "Steigung_unbekannt"; -VAL_ 1124 PSD_Steigung_2_Vorz 0 "Gefaelle" 1 "Steigung"; -VAL_ 1124 PSD_Steigung_2_Attribute_kompl 0 "Steigungen_nicht_komplett" 1 "Steigungen_komplett"; -VAL_ 1153 ZR_LoGeWa_Event_Kombiwarnung 0 "Init" 1 "Unfall" 2 "Traktionsverlust" 3 "Panne" 4 "Sichtbehinderung" 5 "Aquaplaning" 6 "EEBL" 7 "SEF_stat" 8 "SEF_dyn_allgemein" 9 "SEF_dyn_vorne" 10 "SEF_dyn_hinten" 11 "SEF_dyn_links" 12 "SEF_dyn_rechts" 13 "Stauende"; -VAL_ 1153 Nav_FoD_Status 0 "Init" 1 "Nav_permanently_available" 2 "FoD_Nav_not_activated" 3 "FoD_Nav_activated" 4 "R4N_Nav_not_activated"; -VAL_ 1153 MIB_Tongenerator_PH_verfuegbar 0 "Tongenerator_nicht_verfuegbar" 1 "Tongenerator_vorne_verfuegbar" 2 "Tongenerator_hinten_verfuegbar" 3 "Tongenerator_gesamt_verfuegbar" 4 "Tongenerator_im_AMP"; -VAL_ 1153 DSSS_Warning 0 "No_Warning" 1 "Red_traffic_light_guidance" 2 "Stop_sign_warning" 3 "Rear_end_collision_avoidance_warning" 4 "Intersection_collision_avoidance_warning_right" 5 "Intersection_collision_avoidance_warning_left" 6 "turn_right_collision_avoidance" 7 "turn_left_collision_avoidance" 8 "pedestrian_crossing_right" 9 "pedestrian_crossing_left" 10 "bicycle_collision_right" 11 "bicycle_collision_left"; -VAL_ 1153 ZR_Kindersicherung_RSE 0 "inaktiv" 1 "aktiv"; -VAL_ 1153 ZR_RSE_aktivieren 0 "inaktiv" 1 "aktiv"; -VAL_ 1153 MMI_SDS_aktiv 0 "inaktiv" 1 "aktiv"; -VAL_ 1153 MU_SecondDisplay 0 "Init" 1 "gueltige_Karte" 2 "ungueltiges_Signal" 3 "Nicht_Verbaut"; -VAL_ 1153 MMI_Telefon_aktiv 0 "Telefongespraech_nicht_aktiv" 1 "Telefongespraech_aktiv"; -VAL_ 1153 MMI_Gurt_Mic_ref 0 "Downlink_inaktiv" 1 "Downlink_aktiv"; -VAL_ 1153 ZR_Sta_Inszenierung 0 "Init" 1 "Inszenierung_deaktiviert" 2 "Inszenierung_Start" 3 "Inszenierung_Stop"; -VAL_ 1153 MMI_Gauges_active 0 "gauges_inactive" 1 "gauges_active"; -VAL_ 1153 ZR_MXB_Manoever_Ansage 0 "keine_Ansage" 1 "Ansage_ohne_Richtung" 2 "Ansage_rechte_Richtung" 3 "Ansage_linke_Richtung"; -VAL_ 1153 ZR_LAPP_Sondermodus_Status 0 "keine_Anforderung" 1 "Sondermodus_aktiv" 2 "Aktivierung_nicht_moeglich"; -VAL_ 1153 MMI_StartStopp_Info 0 "Stoppfreigabe" 1 "Stoppverbot" 2 "Startanforderung" 3 "Fehler"; -VAL_ 1153 ZR_Parken_Sondermodus 0 "Init" 1 "Sondermodus_aktiv" 2 "Sondermodus_nicht_verfuegbar" 3 "WLAN_aus" 4 "WLAN_auscodiert" 15 "keine_WLAN_HW"; -VAL_ 1153 ZR_Rundenbewertung 0 "Bewertung_nicht_aktiv" 1 "langsamer" 2 "gleich_schnell" 3 "schneller" 4 "reserviert" 5 "reserviert" 6 "reserviert" 7 "reserviert" 8 "reserviert" 9 "reserviert" 10 "reserviert" 11 "reserviert" 12 "reserviert" 13 "reserviert" 14 "Init" 15 "Funktion_nicht_verbaut"; -VAL_ 1153 ZR_Rundenfortschritt 254 "Init" 255 "Funktion_nicht_verbaut"; -VAL_ 1155 Mo_Powermeter_Grenze 4093 "OFF"; -VAL_ 1155 MO_Text_Aktivierung_Antrieb 0 "keine_Anzeige" 1 "Ladestecker_nicht_fahrbereit" 2 "erneute_Aktivierung_erforderlich" 3 "Warten_Antrieb_wird_aktiviert" 4 "zum_Fahren_Bremse_und_Fahrstufe" 5 "h2_Tankklappe_nicht_fahrbereit" 6 "zum_Starten_Bremse_treten" 7 "zum_Starten_Kupplung_treten" 15 "Init"; -VAL_ 1155 MO_Powermeter_Inszenierung_aktiv 0 "keine_Anzeige" 1 "Inszenierung_aktiv"; -VAL_ 1155 MO_Powermeter_Charge_Grenze 1022 "Init" 1023 "Fehler"; -VAL_ 1155 MO_Powermeter_Grenze_strategisch 4094 "Init" 4095 "Fehler"; -VAL_ 1155 MO_Powermeter_untere_E_Grenze 4094 "Init" 4095 "Fehler"; -VAL_ 1155 MO_Powermeter_obere_E_Grenze 4094 "Init" 4095 "Fehler"; -VAL_ 1175 PH_Visualisierung 0 "Aus" 1 "Angefragt" 2 "InAnzeige" 3 "Abgefordert" 6 "Init" 7 "Fehler"; -VAL_ 1175 PDC_Tonausgabe_Front 0 "kein_Ton" 1 "Intervallton_1" 2 "Intervallton_2" 3 "Intervallton_3" 4 "Intervallton_4" 5 "Intervallton_5" 6 "Dauerton" 7 "Fehlerton" 8 "RCTATon"; -VAL_ 1175 PDC_Tonausgabe_Heck 0 "kein_Ton" 1 "Intervallton_1" 2 "Intervallton_2" 3 "Intervallton_3" 4 "Intervallton_4" 5 "Intervallton_5" 6 "Dauerton" 7 "Fehlerton" 8 "Erstwarnton_hinten" 9 "RCTATon"; -VAL_ 1175 PH_nachtr_Stopp_Anf 0 "nicht_angefordert" 1 "angefordert"; -VAL_ 1175 PH_Abschaltursache 0 "keine, bzw. System aktiv" 1 "Abschaltung durch Herausnahme R-Gang" 2 "Abschaltung ueber Geschwindigkeit" 3 "Abschaltung ueber PDC-Taster" 4 "Abschaltung wegen PLA" 5 "Abschaltung durch KL 15 Bit = 0" 6 "tbd." 7 "Fehler-/gestört Zustand, System noch aktiv"; -VAL_ 1175 PH_Opt_Anzeige_V_ein 0 "optische Anzeige vorne nicht aktiv" 1 "optische Anzeige vorne aktiviert"; -VAL_ 1175 PH_Opt_Anzeige_H_ein 0 "Optische Anzeige aus" 1 "optische Anzeige hinten aktiviert"; -VAL_ 1175 PH_Opt_Anz_V_Hindernis 0 "optische Anzeige vorne meldet kein Hindernis" 1 "optische Anzeige vorne meldet Hindernis im Warnbereich"; -VAL_ 1175 PH_Opt_Anz_H_Hindernis 0 "optische Anzeige hinten meldet kein Hindernis" 1 "optische Anzeige hinten meldet Hindernis im Warnbereich"; -VAL_ 1175 PH_Tongeber_V_aktiv 0 "Tongeber vorne nicht aktiv" 1 "Tongeber vorne aktiv"; -VAL_ 1175 PH_Tongeber_H_aktiv 0 "Tongeber hinten nicht aktiv" 1 "Tongeber hinten aktiv"; -VAL_ 1175 PH_Tongeber_mute 0 "Tongeber nicht stummgeschaltet" 1 "Tongeber stummgeschaltet"; -VAL_ 1175 PH_Anf_Audioabsenkung 0 "Keine_Audioabsenkung" 1 "Anforderung_Audioabsenkung"; -VAL_ 1175 PH_Tongeber_H_verfuegbar 0 "nicht verfügbar" 1 "verfügbar"; -VAL_ 1175 PLA_Anf_Aufschaltung_RVC 0 "Keine_RVC_Aufschalteanf" 1 "RVC_Aufschalteanforderung"; -VAL_ 1175 PH_Taster 0 "Taster_nicht_gedrueckt" 1 "Taster_gedrueckt" 2 "reserviert" 3 "Fehler"; -VAL_ 1175 PH_Anf_Verdeck 0 "Verdeckbetrieb_freigegeben" 1 "Verdeckbetrieb_sperren" 2 "reserviert" 3 "reserviert"; -VAL_ 1175 PH_StartStopp_Info 0 "Motorlauf_nicht_notwendig_(Stoppfreigabe)" 1 "Motoranlauf_nicht_zwingend_notwendig_(Stoppverbot,keine_Startanforderung)" 2 "Motoranlauf_zwingend_notwendig_(Startanforderung)" 3 "Systemfehler"; -VAL_ 1175 PH_Stoermeldung 0 "keine_Anzeige_kein_Gong" 1 "Textmeldung_PDC_hinten_gestoert_mit_Gong" 2 "Textmeldung_PDC_hinten_gestoert_ohne_Gong" 3 "Textmeldung_PDC_vorn_gestoert_mit_Gong" 4 "Textmeldung_PDC_vorn_gestoert_ohne_Gong" 5 "Textmeldung_PDC_gestoert_mit_Gong" 6 "Textmeldung_PDC_gestoert_ohne_Gong" 7 "Textmeldung_PDC_seitlich_gestoert_mit_Gong" 8 "Textmeldung_PDC_seitlich_gestoert_ohne_Gong"; -VAL_ 1175 PH_defekt 0 "PH aktiv" 1 "PH wurde aufgrund eines Defektes deaktiviert"; -VAL_ 1175 PH_gestoert 0 "PH aktiv" 1 "PH wurde auf Grund einer Stoerung tempraer deaktiviert"; -VAL_ 1175 PH_Systemzustand 0 "Anlage aus" 1 "Anlage durch einlegen R-Gang aktiviert" 2 "Anlage manuell durch Taster aktiviert" 3 "Anlage automatisch aktiviert" 4 "Anlage durch ARA aktiviert" 6 "Init - Initialisierungsphase nach Kl. 15 ein / Reset" 7 "Fehler-/gestört Zustand, System noch aktiv"; -VAL_ 1175 PH_Display_Kundenwunsch 0 "Anzeige aus" 1 "Grafik" 2 "Rear View" 3 "automatisch"; -VAL_ 1283 HVK_Istmodus_Anf 0 "nicht_angefordert" 1 "angefordert"; -VAL_ 1283 HVK_TN1_Sollmodus 0 "HV_Off" 1 "HV_On" 2 "reserviert" 3 "Initialisierung"; -VAL_ 1283 HVK_MO_EmSollzustand 0 "HvOff" 1 "HvStbyReq" 2 "HvStbyWait" 3 "HvBattOnReq" 4 "HvBattOnWait" 10 "HvOnIdle" 18 "HvOnDrvReq" 19 "HvOnDrvWait" 20 "HvOnDrvRdy" 28 "HvStepUpReq" 29 "HvStepUpWait" 30 "HvStepUp" 38 "HvStepDownReq" 39 "HvStepDownWait" 40 "HvStepDown" 46 "HvAcChPreReq" 47 "HvAcChPreWait" 48 "HvAcChReq" 49 "HvAcChWait" 50 "HvAcCh" 56 "HvDcChPreReq" 57 "HvDcChPreWait" 58 "HvDcChReq" 59 "HvDcChWait" 60 "HvDcCh" 67 "HvChOffReq" 68 "HvChOffWait" 69 "HvOnIdleReq" 70 "HvOnIdleWait" 96 "HvCpntOffReq" 97 "HvCpntOffWait" 98 "HvBattOffReq" 99 "HvBattOffWait" 109 "HvDcDcFailOffReq" 110 "HvDcDcFail" 119 "HvElmOffReq" 120 "HvElmOff" 126 "HvFailCpntOffReq" 127 "HvFailCpntOffWait" 128 "HvFailBattOffReq" 129 "HvFailBattOffWait" 130 "HvFailBattOff" 138 "HvFailUCtlReq" 139 "HvFailUCtlWait" 140 "HvFailUCtl" 150 "HvEmgcyOff" 255 "Init"; -VAL_ 1283 HVK_BMS_Sollmodus 0 "HV_Off" 1 "HV_On" 3 "AC_Laden_erw" 4 "AC_Laden" 6 "DC_Laden" 7 "Init"; -VAL_ 1283 HVK_DCDC_Sollmodus 0 "Standby" 1 "HV_On_Vorladen" 2 "Tiefsetzen" 3 "Hochsetzen" 4 "Pruefpuls_12V" 7 "Initialisierung"; -VAL_ 1283 HVK_EKK_Sollmodus 0 "Keine_Freigabe" 1 "Freigabe" 2 "Freigabe_ausgesetzt" 7 "Init"; -VAL_ 1283 HVK_HVPTC_Sollmodus 0 "Keine_Freigabe" 1 "Freigabe" 2 "Freigabe_ausgesetzt" 7 "Init"; -VAL_ 1283 HVK_HVLM_Sollmodus 0 "keine_Freigabe" 1 "Freigabe_Lademanager" 2 "Vorladung_AC_Pfad" 7 "Init"; -VAL_ 1283 HVK_HV_Netz_Warnungen 0 "Keine_Warnung" 1 "Warntext_HV_Netz_Anf" 2 "Fehlertext_HV_Netz_Anf" 3 "Warnung_Kein_Wiederstart_moeglich"; -VAL_ 1283 HV_Bordnetz_aktiv 0 "inaktiv" 1 "aktiv"; -VAL_ 1283 HV_Bordnetz_Fehler 0 "kein_Fehler" 1 "Fehler"; -VAL_ 1283 HVK_Gesamtst_Spgfreiheit 0 "Funktion_Init__ohne_Funktion" 1 "HV_System_spannungsfrei" 2 "HV_System_nicht_spannungsfrei" 3 "Fehler"; -VAL_ 1283 HVK_AktiveEntladung_Anf 0 "nicht_angefordert" 1 "angefordert"; -VAL_ 1283 HVK_Iso_Messung_Start 0 "keine_Messung" 1 "Messung_HV_Netz_1" 2 "Messung_HV_Netz_2" 4 "deaktiviert"; -VAL_ 1283 HVK_DCDC_EKK_Sollmodus 0 "aus" 1 "ein" 2 "reserviert" 3 "Init"; -VAL_ 1312 LoGeWa_Event_Kombiwarnung 0 "Init" 1 "Unfall" 2 "Traktionsverlust" 3 "Panne" 4 "Sichtbehinderung" 5 "Aquaplaning"; -VAL_ 1312 AB_Anforderung_eCall 0 "keine_Anforderung" 1 "Anforderung"; -VAL_ 1312 AB_Anprall_Seite_Beifahrer 0 "kein_Anprall" 1 "Anprall_erkannt"; -VAL_ 1312 AB_Anprall_Rollover 0 "kein_Anprall" 1 "Anprall_erkannt"; -VAL_ 1312 AB_Anprall_FGS 0 "kein_Anprall" 1 "Anprall_erkannt"; -VAL_ 1312 AB_Anprall_Front_Beifahrer 0 "kein_Anprall" 1 "Anprall_erkannt"; -VAL_ 1312 AB_Anprall_Front_Fahrer 0 "kein_Anprall" 1 "Anprall_erkannt"; -VAL_ 1312 AB_Anprall_Heck_Beifahrer 0 "kein_Anprall" 1 "Anprall_erkannt"; -VAL_ 1312 AB_Anprall_Heck_Fahrer 0 "kein_Anprall" 1 "Anprall_erkannt"; -VAL_ 1312 AB_Wickelklappung_Reihe2_MI 0 "nicht_verbaut" 1 "nicht_verfuegbar__Fehler_oder_Init" 2 "nicht_verriegelt" 3 "verriegelt"; -VAL_ 1312 AB_Belegung_VB 0 "nicht_verfuegbar" 1 "Fehler" 2 "nicht_belegt" 3 "belegt"; -VAL_ 1312 AB_Abschaltanf_SIH_BF 0 "Normalbetrieb" 1 "Abschaltung_angefordert"; -VAL_ 1312 AB_Anprall_Seite_Fahrer 0 "kein_Anprall" 1 "Anprall_erkannt"; -VAL_ 1312 SC_PAO_Schriftzug_Anf 0 "LED aus" 1 "LED an" 2 "LED blinken" 3 "reserviert"; -VAL_ 1312 SC_PAO_ON_Anf 0 "LED aus" 1 "LED an" 2 "LED blinken" 3 "reserviert"; -VAL_ 1312 SC_PAO_OFF_Anf 0 "LED aus" 1 "LED an" 2 "LED blinken" 3 "reserviert"; -VAL_ 1312 AB_Crashschwere 0 "kein_Ereignis" 1 "Crashschwere_1" 2 "Crashschwere_2" 3 "Crashschwere_3" 4 "Crashschwere_4" 5 "Crashschwere_5" 6 "Crashschwere_2_bis_5" 7 "Fehler"; -VAL_ 1312 AB_Anforderung_USM 0 "keine_Anforderung" 1 "Anforderung"; -VAL_ 1312 AB_Gurtschloss_FA 0 "nicht_verbaut" 1 "nicht_verfügbar (Fehler oder Init)" 2 "nicht_gesteckt" 3 "gesteckt"; -VAL_ 1312 AB_Gurtschloss_BF 0 "nicht_verbaut" 1 "nicht_verfügbar (Fehler oder Init)" 2 "nicht_gesteckt" 3 "gesteckt"; -VAL_ 1312 AB_Gurtschloss_Reihe2_FA 0 "nicht_verbaut" 1 "nicht_verfügbar (Fehler oder Init)" 2 "nicht_gesteckt" 3 "gesteckt"; -VAL_ 1312 AB_Gurtschloss_Reihe2_MI 0 "nicht_verbaut" 1 "nicht_verfügbar (Fehler oder Init)" 2 "nicht_gesteckt" 3 "gesteckt"; -VAL_ 1312 AB_Gurtschloss_Reihe2_BF 0 "nicht_verbaut" 1 "nicht_verfügbar (Fehler oder Init)" 2 "nicht_gesteckt" 3 "gesteckt"; -VAL_ 1312 AB_Gurtschloss_Reihe3_FA 0 "nicht_verbaut" 1 "nicht_verfügbar (Fehler oder Init)" 2 "nicht_gesteckt" 3 "gesteckt"; -VAL_ 1312 AB_Gurtschloss_Reihe3_MI 0 "nicht_verbaut" 1 "nicht_verfügbar (Fehler oder Init)" 2 "nicht_gesteckt" 3 "gesteckt"; -VAL_ 1312 AB_Gurtschloss_Reihe3_BF 0 "nicht_verbaut" 1 "nicht_verfügbar (Fehler oder Init)" 2 "nicht_gesteckt" 3 "gesteckt"; -VAL_ 1312 AB_Sitzpos_Sens_FA 0 "nicht verfügbar" 1 "Fehler" 2 "Sitz nicht vorne" 3 "Sitz vorne"; -VAL_ 1312 AB_Sitzpos_Sens_BF 0 "nicht verfügbar" 1 "Fehler" 2 "Sitz nicht vorne" 3 "Sitz vorne"; -VAL_ 1312 AB_Wickelklappung_Reihe2_BF 0 "nicht_verbaut" 1 "nicht_verfuegbar__Fehler_oder_Init" 2 "nicht_verriegelt" 3 "verriegelt"; -VAL_ 1312 AB_Wickelklappung_Reihe2_FA 0 "nicht_verbaut" 1 "nicht_verfuegbar__Fehler_oder_Init" 2 "nicht_verriegelt" 3 "verriegelt"; -VAL_ 1349 AB_Gurtwarn_Reihe2_FA 0 "nicht_verbaut" 1 "keine_Gurtwarnung_Sitz_leer" 2 "keine_Gurtwarnung_Sitz_belegt" 3 "Gurtwarnung_Sitz_belegt"; -VAL_ 1349 AB_Gurtwarn_Reihe2_BF 0 "nicht_verbaut" 1 "keine_Gurtwarnung_Sitz_leer" 2 "keine_Gurtwarnung_Sitz_belegt" 3 "Gurtwarnung_Sitz_belegt"; -VAL_ 1349 AbstWarn_MV_FAS_Fkt_Status 0 "Init" 1 "Funktion_Ist_Ein" 2 "Funktion_Ist_Aus" 3 "Fehler"; -VAL_ 1349 WarnBrems_Charisma_Status 0 "Init" 1 "verfügbar" 2 "nicht verfügbar" 3 "asynchron durch Fahrerwunsch"; -VAL_ 1349 WarnBrems_Charisma_FahrPr 0 "keine_Funktion" 1 "Programm_1" 2 "Programm_2" 3 "Programm_3" 4 "Programm_4" 5 "Programm_5" 6 "Programm_6" 7 "Programm_7" 8 "Programm_8" 9 "Programm_9" 10 "Programm_10" 11 "Programm_11" 12 "Programm_12" 13 "Programm_13" 14 "Programm_14" 15 "Programm_15"; -VAL_ 1349 AB_Gurtwarn_Reihe2_MI 0 "nicht_verbaut" 1 "keine_Gurtwarnung_Sitz_leer" 2 "keine_Gurtwarnung_Sitz_belegt" 3 "Gurtwarnung_Sitz_belegt"; -VAL_ 1349 AB_Gurtwarn_Reihe3_FA 0 "nicht_verbaut" 1 "keine_Gurtwarnung_Sitz_leer" 2 "keine_Gurtwarnung_Sitz_belegt" 3 "Gurtwarnung_Sitz_belegt"; -VAL_ 1349 AB_Gurtwarn_Reihe3_MI 0 "nicht_verbaut" 1 "keine_Gurtwarnung_Sitz_leer" 2 "keine_Gurtwarnung_Sitz_belegt" 3 "Gurtwarnung_Sitz_belegt"; -VAL_ 1349 AB_Gurtwarn_Reihe3_BF 0 "nicht_verbaut" 1 "keine_Gurtwarnung_Sitz_leer" 2 "keine_Gurtwarnung_Sitz_belegt" 3 "Gurtwarnung_Sitz_belegt"; -VAL_ 1349 LGI_FAS_Fkt_Status 0 "Init" 1 "Funktion_Ist_Ein" 2 "Funktion_Ist_Aus" 3 "Fehler"; -VAL_ 1349 PreCrash_FAS_Fkt_Status 0 "Init" 1 "Funktion_Ist_Ein" 2 "Funktion_Ist_Aus" 3 "Fehler"; -VAL_ 1349 AB_SBR_hinten_verbau 0 "ohne_SBR_hinten" 1 "mit_SBR_hinten" 2 "nicht_definiert" 3 "Init"; -VAL_ 1349 AWV_Einstellung_System_ASG 0 "deaktiviert" 1 "aktiviert"; -VAL_ 1349 AWV_Einstellung_Warnung_ASG 0 "Aus" 1 "Setting_2" 2 "Setting_3" 3 "Setting_4" 4 "Setting_5" 5 "Ein"; -VAL_ 1349 SC_PreSense_Modus_Warnung_NV 0 "Aus" 1 "Setting_2" 2 "Setting_3" 3 "Setting_4" 4 "Setting_5" 5 "Ein"; -VAL_ 1349 SC_PreSense_Modus_Warnung_MV 0 "Aus" 1 "Setting_2" 2 "Setting_3" 3 "Setting_4" 4 "Setting_5" 5 "Ein"; -VAL_ 1349 SC_PreSense_Modus_System_MV 0 "deaktiviert" 1 "aktiviert"; -VAL_ 1349 SC_PreSense_Modus_System_NV 0 "deaktiviert" 1 "aktiviert"; -VAL_ 1349 SC_PreSense_Modus_System_KAS 0 "deaktiviert" 1 "aktiviert"; -VAL_ 1355 PH_Verschmutzungsmeldung 0 "keine_Anzeige_kein_Gong" 1 "Textmeldung_PDC_hinten_verschmutzt_mit_Gong" 2 "Textmeldung_PDC_hinten_verschmutzt_ohne_Gong" 3 "Textmeldung_PDC_vorn_verschmutzt_mit_Gong" 4 "Textmeldung_PDC_vorn_verschmutzt_ohne_Gong" 5 "Textmeldung_PDC_verschmutzt_mit_Gong" 6 "Textmeldung_PDC_verschmutzt_ohne_Gong" 7 "Textmeldung_PDC_seitlich_verschmutzt_mit_Gong" 8 "Textmeldung_PDC_seitlich_verschmutzt_ohne_Gong"; -VAL_ 1355 PH_Aufschaltursache 0 "Anlage aus" 1 "Anlage durch einlegen R-Gang aktiviert" 2 "Anlage manuell durch Taster aktiviert" 3 "Anlage automatisch aktiviert" 4 "Anlage durch ARA aktiviert" 5 "Rueckwaertsrollen" 6 "Anlage_durch_PLA_aktiviert" 7 "Anlage_durch_IPA_aktiviert" 8 "Anlage_durch_FA_aktiviert" 9 "Anlage_durch_RBF_oder_MA_aktiviert" 10 "Anlage_durch_Smartphone_aktiviert" 11 "Anlage_durch_Jokertaste_aktiviert" 12 "Anlage_durch_Favoritentasten_aktiviert" 13 "Anlage_durch_SideViewTaster_aktiviert" 14 "Anlage_durch_RCTA_aktiviert" 15 "Anlage_durch_KAS_aktiviert" 16 "Anlage_durch_AWC_aktiviert" 30 "Init_Initialisierungsphase_nach_Kl_15_ein_oder_Reset" 31 "Fehler_gestoerter_Zustand_System_noch_aktiv"; -VAL_ 1355 PH_Ton_Ausgabe 0 "Init" 1 "Intervallton_vorne" 2 "Intervallton_hinten" 3 "Dauerton_vorne" 4 "Dauerton_hinten" 5 "Quittierungston" 6 "Reserviert" 7 "Fehler"; -VAL_ 1355 PH_Ton_Pausenlaenge 0 "Init" 1 "Pause_5ms" 2 "Pause_10ms" 3 "Pause_15ms" 100 "Pause_500ms" 101 "Reserviert" 126 "Reserviert" 127 "Fehler"; -VAL_ 1355 PH_Ton_Richtung 0 "vorne" 1 "vorne_rechts" 2 "rechts" 3 "rechts_hinten" 4 "hinten" 5 "hinten_links" 6 "links" 7 "vorne_links"; -VAL_ 1355 PH_Ton_Lautstaerke 0 "Minimallautstaerke" 1 "Lautstaerke_1" 2 "Lautstaerke_2" 3 "Lautstaerke_3" 4 "Lautstaerke_4" 5 "Lautstaerke_5" 6 "Lautstaerke_6" 7 "Maximallautstaerke"; -VAL_ 1355 BCM_WAH_Meldung 0 "Init" 1 "Fehlermeldung_bei_Nichtverfuegbarkeit_mit_Gong" 2 "Fehlermeldung_bei_Nichtverfuegbarkeit_ohne_Gong" 3 "Anzeige_dass_Fahrzeug_erkannt_wurde_und_Funktion_aktiv_ist" 4 "Wiederanfahrhinweis_mit_Gong" 5 "Wiederanfahrhinweis_ohne_Gong"; -VAL_ 1355 PDC_Charisma_Status 0 "Init" 1 "verfuegbar" 2 "nicht_verfuegbar" 3 "asynchron_durch_Fahrerwunsch"; -VAL_ 1355 PDC_Charisma_FahrPr 0 "keine_Funktion" 1 "Programm_1" 2 "Programm_2" 3 "Programm_3" 4 "Programm_4" 5 "Programm_5" 6 "Programm_6" 7 "Programm_7" 8 "Programm_8" 9 "Programm_9" 10 "Programm_10" 11 "Programm_11" 12 "Programm_12" 13 "Programm_13" 14 "Programm_14" 15 "Programm_15"; -VAL_ 1361 WFS_Schluessel_Fahrberecht 0 "kein authorisierter Schluessel erkannt" 1 "aktive_Funkschluessel_Nr_01" 2 "aktive_Funkschluessel_Nr_02" 3 "aktive_Funkschluessel_Nr_03" 4 "aktive_Funkschluessel_Nr_04" 5 "aktive_Funkschluessel_Nr_05" 6 "aktive_Funkschluessel_Nr_06" 7 "aktive_Funkschluessel_Nr_07" 8 "aktive_Funkschluessel_Nr_08" 9 "ungueltig_09" 10 "ungueltig_10" 11 "ungueltig_11" 12 "ungueltig_12" 13 "ungueltig_13" 14 "ungueltig_14" 15 "digitaler_Schluessel_aktiv"; -VAL_ 1361 WFS_ID_Geb_autorisiert 0 "Schluessel_nicht_authorisiert" 1 "Schluessel authorisiert"; -VAL_ 1361 WFS_ID_Geb_autorisiert_in_Kl15 0 "nicht_authorisiert_in_Kl15" 1 "authorisiert_in_Kl15"; -VAL_ 1361 WFS_ID_Geb_steckt 0 "kein_Schluessel_im_Zuendschloss" 1 "Schluessel steckt im Zuendschloss"; -VAL_ 1361 WFS_Schluessel_Soll 0 "Init"; -VAL_ 1361 WFS_Schluessel_Ist 0 "Init"; -VAL_ 1361 WFS_Safe 0 "Init" 1 "WFS nicht deaktiviert"; -VAL_ 1361 WFS_LZ 0 "nicht def." 1 "LZ 1" 2 "LZ 2" 3 "LZ 3"; -VAL_ 1361 WFS_ELV_authorisiert 0 "ELV_nicht_authorisiert" 1 "ELV_authorisiert"; -VAL_ 1361 WFS_LF_Aktiv 0 "Funktempfang_nicht_aktiv" 1 "LF_Funkempfang_aktiv"; -VAL_ 1361 WFS_Betrieb_Lesespule 0 "keine_Schluesselkomm_Lesespule" 1 "Schluesselkomm_Lesespule"; -VAL_ 1361 WFS_Klemmenfreigabe 0 "keine_Freigabe" 1 "Freigabe"; -VAL_ 1361 WFS_Fahrerhinweise 0 "Keine_Anzeigeanforderung" 1 "Schuessel_Auth_niO" 2 "Notlauf_aktiv" 3 "Schluessel_Kessy_nicht_gefunden"; -VAL_ 1361 WFS_Parken_Status 0 "Limitierung_inaktiv" 1 "Limitierung_aktiv" 2 "Abbruch"; -VAL_ 1411 BCM_FH_Freigabe 1 "Funktionsfreigabe Fensterheber"; -VAL_ 1411 BCM_Komfortfkt_Freigabe 0 "Komfortfunktion gesperrt" 1 "globale Freigabe der Komfortfunktion erteilt"; -VAL_ 1411 BCM_HSK_Freigabe 0 "erlauben" 1 "sperren"; -VAL_ 1411 BCM_Verdeck_Freigabe 0 "Verdeckbetrieb nicht erlaubt" 1 "Verdeckbetrieb erlaubt"; -VAL_ 1411 ZV_verriegelt_intern_ist 1 "Fahrzeug innen verriegelt; Istzustand"; -VAL_ 1411 ZV_verriegelt_extern_ist 1 "Fahrzeug_aussen_verriegelt_Istzustand"; -VAL_ 1411 ZV_verriegelt_intern_soll 1 "Fahrzeug verriegelt intern; Sollzusstand"; -VAL_ 1411 ZV_verriegelt_extern_soll 1 "Fahrzeug verriegelt extern; Sollzusstand"; -VAL_ 1411 ZV_gesafet_extern_ist 1 "Fahrzeug aussen gesafet; Istzustand"; -VAL_ 1411 ZV_gesafet_extern_soll 1 "Fahrzeug_aussen_gesafet_Sollzustand"; -VAL_ 1411 ZV_Einzeltuerentriegelung 1 "Fahrzeug an Einzeltuer entriegelt"; -VAL_ 1411 ZV_Heckeinzelentriegelung 1 "Heckdeckeleinzelentriegelung"; -VAL_ 1411 ZV_FT_offen 0 "FT_geschlossen" 1 "FT_geoeffnet"; -VAL_ 1411 ZV_BT_offen 0 "BT_geschlossen" 1 "BT_geoeffnet"; -VAL_ 1411 ZV_HFS_offen 0 "geschlossen" 1 "offen"; -VAL_ 1411 ZV_HBFS_offen 0 "geschlossen" 1 "offen"; -VAL_ 1411 ZV_HD_offen 1 "Heckdeckel_auf"; -VAL_ 1411 ZV_HS_offen 0 "Heckscheibe_geschlossen" 1 "Heckscheibe auf"; -VAL_ 1411 IRUE_aktiv 0 "unscharf" 1 "scharf"; -VAL_ 1411 DWA_aktiv 0 "unscharf" 1 "scharf"; -VAL_ 1411 HD_Hauptraste 0 "geschlossen" 1 "offen"; -VAL_ 1411 HD_Vorraste 0 "geschlossen" 1 "offen"; -VAL_ 1411 FFB_CarFinder 0 "nicht aktiv" 1 "aktiv"; -VAL_ 1411 FFB_Komfortoeffnen 0 "kein_Komfortoeffnen_empfangen" 1 "Komfortoeffnen ueber Funk empfangen"; -VAL_ 1411 FFB_Komfortschliessen 0 "kein_Komfortschliessen_empfangen" 1 "Komfortschliessen ueber Funk empfangen"; -VAL_ 1411 ZV_Schluessel_Zugang 0 "kein_auth_Schluessel_erkannt" 1 "aktive_Funkschluessel_Nr_01" 2 "aktive_Funkschluessel_Nr_02" 3 "aktive_Funkschluessel_Nr_03" 4 "aktive_Funkschluessel_Nr_04" 5 "aktive_Funkschluessel_Nr_05" 6 "aktive_Funkschluessel_Nr_06" 7 "aktive_Funkschluessel_Nr_07" 8 "aktive_Funkschluessel_Nr_08" 9 "ungueltig_09" 10 "ungueltig_10" 11 "ungueltig_11" 12 "ungueltig_12" 13 "ungueltig_13" 14 "ungueltig_14" 15 "ungueltig_15"; -VAL_ 1411 ZV_SafeFunktion_aktiv 0 "inaktiv" 1 "aktiv"; -VAL_ 1411 FBS_Warn_Schluessel_Batt 0 "i.O." 1 "defekt"; -VAL_ 1411 ZV_Oeffnungsmodus 0 "globale_Oeffnung" 1 "ZV_mit_Einzeltuerentr" 2 "ZV_individuell_selektiv" 3 "ZV_seitenselektiv"; -VAL_ 1411 HFS_verriegelt 0 "nicht_verriegelt" 1 "verriegelt"; -VAL_ 1411 HFS_gesafet 0 "nicht_gesafet" 1 "gesafet"; -VAL_ 1411 HBFS_verriegelt 0 "nicht_verriegelt" 1 "verriegelt"; -VAL_ 1411 HBFS_gesafet 0 "nicht_gesafet" 1 "gesafet"; -VAL_ 1411 ZV_ist_Zustand_verfuegbar 0 "nicht_verfuegbar" 1 "verfuegbar_alle_TSGs_am_Bus"; -VAL_ 1411 IRUE_Taster_Fkts_LED 0 "LED_aus" 1 "LED_ein"; -VAL_ 1411 ZV_Tankklappe_offen 0 "Tankklappe_geschlossen" 1 "Tankklappe_offen"; -VAL_ 1411 ZV_Rollo_auf 0 "inaktiv" 1 "aktiv"; -VAL_ 1411 ZV_Rollo_zu 0 "inaktiv" 1 "aktiv"; -VAL_ 1411 ZV_SAD_auf 0 "inaktiv" 1 "aktiv"; -VAL_ 1411 ZV_SAD_zu 0 "inaktiv" 1 "aktiv"; -VAL_ 1411 BCM_Tankklappensteller_Fehler 0 "kein_Fehler" 1 "Fehler"; -VAL_ 1411 ZV_verriegelt_soll 0 "Init" 1 "nicht_verriegelt" 2 "verriegelt"; -VAL_ 1413 SI_Sammel_SG_Fehler 61 "Reserviert" 62 "Overflow" 63 "ungueltig"; -VAL_ 1413 SI_Diagnose_Aktiv 0 "inaktiv" 1 "aktiv"; -VAL_ 1413 SI_QRS_Mode 0 "QRS_Messmodus_nicht_aktiv" 1 "QRS_Messmodus_aktiv"; -VAL_ 1413 SI_T_Mode 0 "Transportmodus_nicht_aktiv" 1 "Transportmodus_aktiv"; -VAL_ 1413 SI_NWDF 0 "Ueberwachung_nicht_freigegeben" 1 "Ueberwachung_freigegeben"; -VAL_ 1413 SI_NWDF_gueltig 0 "NWDF_wird_nicht_unterstuetzt" 1 "NWDF_wird_unterstuetzt"; -VAL_ 1413 SI_Sammelfehler 0 "kein_Sammelfehler" 1 "Sammelfehler"; -VAL_ 1413 GW_KD_Fehler 0 "kein_KD_Fehler" 1 "KD_Fehler"; -VAL_ 1413 SI_T_Schutz 0 "Transportschutz_nicht_aktiv" 1 "Transportschutz_aktiv"; -VAL_ 1413 SI_BUS_01 0 "keine_Busruhe" 1 "Busruhe"; -VAL_ 1413 SI_BUS_02 0 "keine_Busruhe" 1 "Busruhe"; -VAL_ 1413 SI_BUS_03 0 "keine_Busruhe" 1 "Busruhe"; -VAL_ 1413 SI_BUS_04 0 "keine_Busruhe" 1 "Busruhe"; -VAL_ 1413 SI_BUS_05 0 "keine_Busruhe" 1 "Busruhe"; -VAL_ 1413 SI_BUS_06 0 "keine_Busruhe" 1 "Busruhe"; -VAL_ 1413 SI_BUS_07 0 "keine_Busruhe" 1 "Busruhe"; -VAL_ 1413 SI_BUS_08 0 "keine_Busruhe" 1 "Busruhe"; -VAL_ 1413 SI_BUS_09 0 "keine_Busruhe" 1 "Busruhe"; -VAL_ 1413 SI_BUS_10 0 "keine_Busruhe" 1 "Busruhe"; -VAL_ 1413 SI_BUS_11 0 "keine_Busruhe" 1 "Busruhe"; -VAL_ 1413 SI_BUS_12 0 "keine_Busruhe" 1 "Busruhe"; -VAL_ 1413 SI_BUS_13 0 "keine_Busruhe" 1 "Busruhe"; -VAL_ 1413 SI_BUS_14 0 "keine_Busruhe" 1 "Busruhe"; -VAL_ 1413 SI_BUS_15 0 "keine_Busruhe" 1 "Busruhe"; -VAL_ 1413 SI_Bus_Identifikation 16 "CAN_Diagnose" 17 "CAN_Antrieb" 18 "CAN_Komfort" 19 "CAN_Infotainment" 20 "CAN_Fahrwerk" 21 "CAN_Extended" 22 "CAN_Hybrid" 23 "CAN_Lade" 24 "CAN_Kombi" 25 "CAN_Komfort_2" 26 "CAN_AFS" 33 "CAN_FahrerAssistenzSysteme" 34 "CAN_Migration" 35 "CAN_Connect" 36 "CAN_AnzeigeBedienung" 37 "CAN_ElectricalVehicle" 40 "CAN_Telematik" 41 "CAN_MFL" 42 "CAN_FahrerAssistenzSysteme_2" 48 "FlexRay_A" 49 "FlexRay_B" 97 "VLAN_FAS" 98 "VLAN_Infotainment" 99 "VLAN_Connect" 100 "VLAN_Komfort" 101 "VLAN_Antrieb" 102 "VLAN_Diagnose" 103 "VLAN_Internet" 104 "VLAN_Gateway" 105 "VLAN_Remote_FC" 106 "VLAN_Connect_2" 107 "VLAN_Licht" 108 "VLAN_Charge" 109 "VLAN_Cockpit" 176 "HCP1_CANFD01" 177 "HCP1_CANFD02" 178 "HCP1_CANFD03" 179 "HCP1_CANFD04" 180 "HCP1_CANFD05" 181 "HCP1_CANFD06" 182 "HCP1_CANFD07" 183 "HCP1_CANFD08" 186 "HCP4_CANFD03" 187 "HCP4_CANFD04" 188 "HCP1_CANFD09" 189 "HCP4_CANFD06" 190 "HCP4_CANFD07" 191 "HCP4_CANFD08" 192 "HCP4_CANFD09" 193 "HCP4_CANFD10" 194 "HCP1_CANFD10" 195 "ICAS1_CANFD2_HCP5_CANFD02" 196 "HCP1_CANFD11" 197 "WU_HCP1_CANFD" 198 "WU_HCP2_1_CANFD" 199 "WU_HCP_2_CANFD" 200 "WU_HCP_3_CANFD" 201 "WU_HCP4_CANFD" 202 "WU_HCP3_CANFD02" 204 "ESC_CANFD" 205 "HCP4_CANFD11" 206 "HCP4_CANFD12" 207 "HCP5_CANFD04" 208 "HCP5_CANFD05" 212 "WU_ConMod_CANFD" 213 "WU_PASD_CANFD"; -VAL_ 1413 SI_CAB 0 "inaktiv" 1 "CAB_01__Tueren" 2 "CAB_02__Anhaenger" 4 "CAB_03__Nightvision" 8 "CAB_04__Sitzverstellung" 16 "CAB_05__Klappen" 32 "CAB_06__Infotainment" 64 "CAB_07__Sub_Infotainment" 128 "CAB_08__Anzeige" 256 "CAB_09__Laden" 512 "CAB_10__Klima" 1024 "CAB_11__FlexRay" 262144 "CAB_19_VLAN_Remote_FC" 524288 "CAB_20_VLAN_Komfort"; -VAL_ 1420 KST_Txt_P_Gang 0 "Aus" 1 "Ein"; -VAL_ 1420 KST_Txt_Panikabschaltung 0 "Aus" 1 "Ein"; -VAL_ 1420 KST_Anf_Klemmenfreigabe_ELV 0 "nicht_angefordert" 1 "angefordert"; -VAL_ 1420 KST_Txt_Komfortabschaltung 0 "inaktiv" 1 "aktiv"; -VAL_ 1420 KST_ZAT_betaetigt 0 "Aus" 1 "Ein"; -VAL_ 1420 KST_Unterdr_Zuendungsmeldung 0 "keine_Unterdr_der_Zuendungsmeldung" 1 "Unterdr_der_Zuendungsmeldung_aktiv"; -VAL_ 1420 KST_aut_Abschaltung_Zuendung 0 "Zuendung_wird_bei_Verl_nicht_deaktiviert" 1 "Zuendung_wird_bei_Verl_deaktiviert"; -VAL_ 1420 KST_Anf_ZV_Verriegelung 0 "inaktiv" 1 "aktiv"; -VAL_ 1420 Relais_VoKo_angesteuert 0 "nicht_angesteuert" 1 "angesteuert"; -VAL_ 1420 RSt_Anforderung_HMS 0 "keine_Anforderung" 1 "halten" 2 "parken" 3 "halten_Standby" 4 "anfahren" 5 "Loesen_ueber_Rampe" 6 "Parken_mit_P"; -VAL_ 1440 LS_Helligkeit_IR 254 "Init" 255 "Fehler"; -VAL_ 1440 LS_Helligkeit_FW 1022 "Init" 1023 "Fehler"; -VAL_ 1440 LS_defekt 0 "OK" 1 "defekt"; -VAL_ 1440 LS_Verbau 0 "Init" 1 "Lichtsensor_verbaut"; -VAL_ 1440 RS_Regenmenge 14 "Init" 15 "Fehler"; -VAL_ 1440 RS_Verbau 0 "Init" 1 "Regensensor verbaut"; -VAL_ 1440 RS_Verglasung_schliessen 0 "Verglasung nicht schliessen" 1 "Verglasung schliessen"; -VAL_ 1440 RS_defekt 0 "OK" 1 "defekt"; -VAL_ 1440 RS_Wischergeschwindigkeit 0 "kein Wischen" 1 "42 Huebe/min" 2 "45 Huebe/min" 3 "48 Huebe/min" 4 "51 Huebe/min" 5 "54 Huebe/min" 6 "57 Huebe/min" 7 "60 Huebe/min"; -VAL_ 1440 RLS_Vorfeldhelligkeit_Boost 0 "groesser_24413_Lux" 1 "bis_24413_Lux" 2 "bis_22193_Lux" 3 "bis_20176_Lux" 4 "bis_18342_Lux" 5 "bis_16647_Lux" 6 "bis_15158_Lux" 7 "bis_13780_Lux" 8 "bis_12527_Lux" 9 "bis_11388_Lux" 10 "bis_10353_Lux" 11 "bis_9412_Lux" 12 "bis_8556_Lux" 13 "bis_7778_Lux" 14 "bis_7071_Lux" 15 "bis_6428_Lux"; -VAL_ 1442 BMS_Status_ServiceDisconnect 0 "gesteckt" 1 "gezogen"; -VAL_ 1442 BMS_Status_Spgfreiheit 0 "Init" 1 "HV_Komponente_spannungsfrei" 2 "HV_Komp_nicht_spannungsfrei" 3 "Fehler_nicht_spannungsfrei"; -VAL_ 1442 BMS_OBD_Lampe_Anf 0 "kein_MIL_Request" 1 "MIL_Request"; -VAL_ 1442 BMS_IstModus 0 "HV_inaktiv" 1 "Fahren_HV_aktiv" 2 "stBalancing" 3 "externes_Laden" 4 "AC_Laden" 5 "Error_Batt" 6 "DC_Laden" 7 "Init"; -VAL_ 1442 BMS_Fehlerstatus 0 "Komponente_IO" 1 "Eingeschr_KompFkt_Isofehler_I" 2 "Eingeschr_KompFkt_Isofehler_II" 3 "Eingeschr_KompFkt_Interlock" 4 "Eingeschr_KompFkt_SD" 5 "Eingeschr_KompFkt_Leistungsred" 6 "Keine_Komponentenfunktion" 7 "Init"; -VAL_ 1442 BMS_Kapazitaet_02 2047 "Init"; -VAL_ 1442 BMS_Soll_SOC_HiRes 2046 "Init" 2047 "Fehler"; -VAL_ 1447 TM_Spiegel_Anklappen 0 "Init" 1 "Spiegel_anklappen"; -VAL_ 1447 TM_Nur_Hupen 0 "inaktiv" 1 "aktiv"; -VAL_ 1447 TM_Door_Lock 0 "Init" 1 "door_lock"; -VAL_ 1447 TM_Door_Unlock 0 "Init" 1 "door_unlock"; -VAL_ 1447 TM_Warnblinken 0 "Init" 1 "Warnblinken_on"; -VAL_ 1447 TM_Panik_Alarm 0 "Init" 1 "panik_alarm_on"; -VAL_ 1447 TM_ZV_Signatur 0 "Init"; -VAL_ 1452 HVEM_IstStrom_HVVerbraucher 4094 "Init" 4095 "Fehler"; -VAL_ 1452 HVEM_Energie_Klima_Vorgabe_HighR 6 "Init" 7 "Fehler"; -VAL_ 1452 HVEM_IstLeistungNA 510 "Init" 511 "Fehler"; -VAL_ 1452 HVEM_Leistung_Klima_Vorgabe 254 "Init" 255 "Fehler"; -VAL_ 1452 HVEM_Nutzbare_Energie 2045 "Max" 2046 "Init" 2047 "Fehler"; -VAL_ 1452 HVEM_Energie_Klima_Vorgabe 254 "Init" 255 "Fehler"; -VAL_ 1452 HVEM_MO_MaxLeistungIgnoriert 0 "Max_Leistung_nicht_ignoriert" 1 "Max_Leistung_ignoriert"; -VAL_ 1485 DC_Fehlerstatus 0 "Komponente_IO" 1 "Eingeschr_KompFkt_Entlad_defekt" 3 "Eingeschr_KompFkt_Interlock" 6 "Keine_Komponentenfunktion" 7 "Init"; -VAL_ 1485 DC_Peakstrom_verfuegbar 0 "Peakstrom_nicht_verfuegbar" 1 "Peakstrom_verfuegbar"; -VAL_ 1485 DC_Abregelung_Temperatur 0 "keine_Abregelung" 1 "Abregelung_Temp"; -VAL_ 1485 DC_IstModus_02 0 "Standby" 1 "HV_On_Vorladen" 2 "Tiefsetzen" 3 "Hochsetzen" 4 "Pruefimpuls_12V" 5 "Fehler" 7 "Initialisierung"; -VAL_ 1485 DC_HV_EKK_IstModus 0 "Standby" 2 "Tiefsetzen" 3 "Hochsetzen" 5 "Fehler" 7 "Initialisierung"; -VAL_ 1485 DC_Status_Spgfreiheit_HV 0 "Init" 1 "HV_Komponente_spannungsfrei" 2 "HV_Komp_nicht_spannungsfrei" 3 "Fehler_nicht_spannungsfrei"; -VAL_ 1485 DC_IstSpannung_EKK_HV 255 "Init"; -VAL_ 1485 DC_Temperatur 254 "Init" 255 "Fehler"; -VAL_ 1505 BCM1_Aussen_Temp_ungef 253 "nicht_verbaut" 254 "Initwert" 255 "Fehler"; -VAL_ 1505 BCM_Heizungsabsperrventil_Status 0 "HAV_offen" 1 "HAV_geschlossen" 2 "Init_oder_nicht_verbaut" 3 "Fehler"; -VAL_ 1505 BCM_Heizungspumpe_Status 0 "Pumpe_aus" 1 "Pumpe_aktiv_und_Stauts_iO" 2 "Init_oder_nicht_verbaut" 3 "Fehler"; -VAL_ 1505 BCM_Kompressorkupplung_Status 0 "Kupplung_offen" 1 "Kupplung_geschlossen" 2 "Init_oder_nicht_verbaut" 3 "Fehler"; -VAL_ 1505 BCM1_PTC_stufig_Status 0 "Aus" 1 "Stufe_1_aktiv" 2 "Stufe_2_aktiv" 3 "Stufe_3_aktiv" 6 "Init_oder_nicht_verbaut" 7 "Fehler"; -VAL_ 1505 BCM1_FStatus_Aussentemp_ungef 0 "iO" 1 "niO"; -VAL_ 1505 BCM1_Kompressorstrom_ist 254 "Init, bzw. nicht verfuegbar" 255 "Fehler"; -VAL_ 1505 BCM1_OBD_FStatus_ATemp 0 "kein Fehler / Init / nicht verbaut" 1 "KS- (Kurzschluss nach minus)" 2 "KS+ (Kurzschluss nach plus)" 3 "OC (Leitungsunterbrechung)" 4 "OOR+ (Signal zu gross)" 5 "OOR- (Signal zu klein)" 6 "RC+ (Signal unplausibel zu gross)" 7 "RC- (Signal unplausibel zu klein)" 8 "KS+/OC (Kurzschluss nach plus/Unterbrechung)" 9 "KS-/OC (Kurzschluss nach minus/Unterbrechung)" 10 "KS-/KS+ (Kurzschluss nach minus/plus)" 11 "KS-/KS+/OC (Kurzschluss nach minus/plus/Unterbrechung)" 12 "frei" 13 "frei" 14 "frei" 15 "frei"; -VAL_ 1513 DS_Kaeltemittel_P 2046 "Init" 2047 "Fehler"; -VAL_ 1513 DS_Status 0 "i.O." 1 "t.b.d." 2 "Init bzw. nicht verfügbar" 3 "Fehler"; -VAL_ 1513 ION_Status 0 "Hochspannung_ausgeschaltet" 1 "Hochspannung_eingeschaltet" 2 "Init"; -VAL_ 1513 ION_Status_LED 0 "Aus" 1 "Ein"; -VAL_ 1513 AAU_Geblaese 126 "Init" 127 "Fehler"; -VAL_ 1513 ION_Status_Taster 0 "nicht_betaetigt" 1 "betaetigt"; -VAL_ 1520 DI_KL_58xd 254 "Init" 255 "Fehler"; -VAL_ 1520 DI_KL_58xs 126 "Init" 127 "Fehler"; -VAL_ 1520 DI_KL_58xt 126 "Init" 127 "Fehler"; -VAL_ 1524 IL_Bel_FS_Ausstieg 0 "inaktiv" 1 "aktiv"; -VAL_ 1524 IL_Bel_BFS_Ausstieg 0 "inaktiv" 1 "aktiv"; -VAL_ 1524 IL_Bel_HFS_Ausstieg 0 "inaktiv" 1 "aktiv"; -VAL_ 1524 IL_Bel_HBFS_Ausstieg 0 "inaktiv" 1 "aktiv"; -VAL_ 1524 BCM1_Innenlicht_gedimmt_V 0 "100% Innenlicht" 1 "gedimmtes Innenlicht"; -VAL_ 1524 BCM1_Innenlicht_gedimmt_H 0 "100% Innenlicht" 1 "gedimmtes Innenlicht"; -VAL_ 1524 IL_Innenlicht_aktiv 0 "Innenlicht inaktiv" 1 "Innenlicht aktiv"; -VAL_ 1524 IL_Klemme_30G_aktiv 0 "Kl_30G_abgeschaltet" 1 "eingeschaltet"; -VAL_ 1524 BCM1_DI_Rampe_Innenlicht 0 "Dimmrampe 0" 1 "Dimmrampe 1"; -VAL_ 1524 BCM1_DI_Rampe_Leselicht 0 "Dimmrampe 0" 1 "Dimmrampe 1"; -VAL_ 1524 BCM1_Innenlicht_H 0 "Aus" 1 "Ein"; -VAL_ 1524 BCM1_Innenlicht_V 0 "Aus" 1 "Ein"; -VAL_ 1524 BCM1_Leselicht_Anf_hl 0 "Aus" 1 "Ein"; -VAL_ 1524 BCM1_Leselicht_Anf_hr 0 "Aus" 1 "Ein"; -VAL_ 1524 BCM1_Leselicht_Anf_vl 0 "Aus" 1 "Ein"; -VAL_ 1524 BCM1_Leselicht_Anf_vr 0 "Aus" 1 "Ein"; -VAL_ 1524 BCM1_Leuchten_Aus 0 "keine Aenderung" 1 "Aus"; -VAL_ 1524 AMB_Charisma_FahrPr 0 "keine_Funktion" 1 "Programm_1" 2 "Programm_2" 3 "Programm_3" 4 "Programm_4" 5 "Programm_5" 6 "Programm_6" 7 "Programm_7" 8 "Programm_8" 9 "Programm_9" 10 "Programm_10" 11 "Programm_11" 12 "Programm_12" 13 "Programm_13" 14 "Programm_14" 15 "Programm_15"; -VAL_ 1524 AMB_Charisma_Status 0 "Init" 1 "verfuegbar" 2 "nicht_verfuegbar" 3 "asynchron_durch_Fahrerwunsch"; -VAL_ 1600 MO_QBit_Ansaugluft_Temp 0 "gueltiger_Wert" 1 "Ersatz_Init_oder_Fehlerwert"; -VAL_ 1600 MO_QBit_Oel_Temp 0 "gueltiger_Wert" 1 "Ersatz_Init_oder_Fehlerwert"; -VAL_ 1600 MO_QBit_Kuehlmittel_Temp 0 "gueltiger_Wert" 1 "Ersatz_Init_oder_Fehlerwert"; -VAL_ 1600 MO_HYB_Fehler_HV_Netz 0 "i_O" 1 "kein_generatorischer_Betrieb_moeglich"; -VAL_ 1600 MO_aktives_Getriebeheizen 0 "kein_Ventil_ansteuern" 1 "Ventil_muss_angesteuert_werden"; -VAL_ 1600 MO_Absperrventil_oeffnen 0 "nicht_verfuegbar" 1 "Ansteuerung_Ventil_zulaessig" 2 "Ventil_oeffnen_oder_geoeffnet" 3 "Ventil_schliessen_oder_geschlossen"; -VAL_ 1600 MO_Ansaugluft_Temp 254 "Init" 255 "Fehler"; -VAL_ 1600 MO_Oel_Temp 253 "nicht_verbaut" 254 "Init" 255 "Fehler"; -VAL_ 1600 MO_Kuehlmittel_Temp 254 "Init" 255 "Fehler"; -VAL_ 1600 MO_Hoeheninfo 255 "Fehler"; -VAL_ 1600 MO_Kennfeldk 0 "keine Kennfeldkühlung vorhanden" 1 "Kennfeldkühlung vorhanden"; -VAL_ 1600 MO_Getriebe_kuehlen 0 "nicht_kuehlen" 1 "kuehlen"; -VAL_ 1600 MO_Heizungspumpenansteuerung 13 "Fehler" 14 "Init" 15 "nicht_verbaut"; -VAL_ 1600 MO_SpannungsAnf 0 "keine_Anforderung" 1 "Anforderung"; -VAL_ 1601 MO_Faktor_Momente_02 0 "nicht_belegt"; -VAL_ 1601 MO_Hybridfahrzeug 0 "kein_Hybridfahrzeug" 1 "Mild_Hybrid" 2 "Full_Hybrid" 3 "PlugIn_Hybrid"; -VAL_ 1601 MO_Getriebe_Code 0 "Init" 2 "DL501" 3 "DL800" 4 "VL381" 5 "DL382_Front" 6 "DL382_Allrad" 7 "DL702" 8 "AL552_Allrad" 9 "AL552_Front" 10 "AL651" 11 "AL551__AL951__AL1000_8A" 12 "PDK_PAG" 13 "AL551_Hybrid" 15 "Handschalter_konventionell" 16 "AQ250_160" 17 "AQ450" 18 "DQ200" 19 "DQ250" 20 "DQ500" 21 "SQ100" 22 "SQ200" 23 "DQ400E" 24 "DQ381" 25 "AL550" 26 "AQ300" 31 "DL800E" 32 "Single_Gear__ohne_GSG_WH_am_MSG" 33 "EQ550_2P"; -VAL_ 1601 MO_StartStopp_Codiert 0 "Start_Stopp_nicht_verbaut" 1 "Start_Stopp_verbaut"; -VAL_ 1601 MO_Anzahl_Zyl 0 "kein_Zylinder" 1 "1_Zylinder" 2 "2_Zylinder" 3 "3_Zylinder" 4 "4_Zylinder" 5 "5_Zylinder" 6 "6_Zylinder" 7 "7_Zylinder" 8 "8_Zylinder" 9 "9_Zylinder" 10 "10_Zylinder" 11 "11_Zylinder" 12 "12_Zylinder" 13 "15_Zylinder" 14 "16_Zylinder" 15 "18_Zylinder"; -VAL_ 1601 MO_Kraftstoffart 0 "Diesel" 1 "Benzin_inkl_E25_E85" 2 "CNG" 3 "LPG" 4 "Wasserstoff" 5 "E100_Ethanol" 15 "kein_Verbrennungskraftstoff"; -VAL_ 1601 MO_Ansaugsystem 0 "Turbo" 1 "Sauger"; -VAL_ 1601 MO_DPF_verbaut 0 "kein_DPF_verbaut" 1 "DPF_verbaut"; -VAL_ 1601 TSK_Codierung 0 "kein_Fahrgeschwindigkeitsregler" 1 "GRA" 2 "GRA_Plus" 3 "Basis_ACC" 4 "ACC_Follow_to_Stop" 5 "ACC_Stop_and_Go" 7 "Codierung_in_Plausibilisierungsphase"; -VAL_ 1603 KBI_Einheit_Datum 0 "Tag/Monat/Jahr" 1 "Monat/Tag/Jahr" 2 "Jahr/Monat/Tag" 3 "reserviert"; -VAL_ 1603 KBI_Einheit_Druck 0 "Druckangabe in bar" 1 "Druckangabe in psi" 2 "Druckangabe in kPa" 3 "tbd."; -VAL_ 1603 KBI_Einheit_Streckenanz 0 "Kilometer" 1 "Meilen"; -VAL_ 1603 KBI_MFA_v_Einheit_02 0 "kmh" 1 "mph"; -VAL_ 1603 KBI_Einheit_Temp 0 "Grad Celsius °C" 1 "Grad Fahrenheit °F"; -VAL_ 1603 KBI_Einheit_Uhrzeit 0 "24h" 1 "12h AM/PM"; -VAL_ 1603 KBI_Einheit_Verbrauch 0 "mpg UK" 1 "mpg USA" 2 "Liter/100km" 3 "km/Liter"; -VAL_ 1603 KBI_Einheit_Volumen 0 "Liter" 1 "Gallonen UK" 2 "Gallonen USA" 3 "reserviert"; -VAL_ 1603 KBI_Einheit_Verbrauch_elektr 0 "kWh_pro_100km" 1 "km_pro_kWh" 2 "kWh_pro_100mls" 3 "mls_pro_kWh" 4 "MPGe"; -VAL_ 1603 KBI_Einheit_Verbrauch_Gas 0 "kg_per_100km" 1 "km_per_kg" 2 "m3_per_100km" 3 "km_per_m3" 4 "miles_per_lbs" 5 "miles_per_yard3" 6 "miles_per_kg" 7 "miles_per_m3" 8 "miles_per_gallon_equivalent_US"; -VAL_ 1603 KBI_Einheit_Masse 0 "kg" 1 "lbs" 2 "reserviert"; -VAL_ 1622 ELV_Anf_Klemme_S 0 "Aus" 1 "Ein"; -VAL_ 1622 ELV_Anf_Klemme_15 0 "Aus" 1 "Ein"; -VAL_ 1622 ELV_Anf_Klemme_50 0 "Aus" 1 "Ein"; -VAL_ 1622 ELV_01_Sendestatus 0 "ELV_sendet_mit_1000ms" 1 "ELV_sendet_mit_50ms"; -VAL_ 1622 ELV_Verriegelt 0 "nicht_verriegelt" 1 "verriegelt"; -VAL_ 1622 ELV_Entriegelt 0 "ELV_nicht_entriegelt" 1 "ELV_entriegelt"; -VAL_ 1622 ELV_ZAT_betaetigt 0 "nicht_betaetigt" 1 "betaetigt"; -VAL_ 1622 ELV_Lebenszustand 0 "Lebenszustand_0" 1 "Lebenszustand_4"; -VAL_ 1622 ELV_Anlernmodus 0 "Normalbetrieb" 1 "Anlernmodus"; -VAL_ 1622 ELV_Klemmenfreigabe 0 "keine_Freigabe" 1 "Freigabe"; -VAL_ 1622 ELV_Abbruch_Anf_Klemmenfreigabe 0 "kein_Abbruch" 1 "Abbruch"; -VAL_ 1622 ELV_LED_Rot 0 "Aus" 1 "Ein"; -VAL_ 1622 ELV_LED_Gelb 0 "Aus" 1 "Ein"; -VAL_ 1622 ELV_Txt_Panikabschaltung 0 "Aus" 1 "Ein"; -VAL_ 1622 ELV_Txt_Lkg_Bewegen 0 "Aus" 1 "Ein"; -VAL_ 1622 ELV_Txt_Werkstatt 0 "Aus" 1 "Ein"; -VAL_ 1622 ELV_Txt_Defekt 0 "Aus" 1 "Ein"; -VAL_ 1622 ELV_Txt_P_Gang 0 "Aus" 1 "Ein"; -VAL_ 1622 ELV_Txt_PN_Gang 0 "Aus" 1 "Ein"; -VAL_ 1622 ELV_Txt_Kupplung 0 "Aus" 1 "Ein"; -VAL_ 1622 ELV_Txt_Bremse 0 "Aus" 1 "Ein"; -VAL_ 1622 ELV_P_verriegelt 0 "nicht_verriegelt" 1 "verriegelt"; -VAL_ 1624 LV_Standlicht_Anzeige 0 "nicht aktiv" 1 "aktiv"; -VAL_ 1624 LV_Abblendlicht_Anzeige 0 "inaktiv" 1 "aktiv"; -VAL_ 1624 LV_Fernlicht_Anzeige 0 "nicht aktiv" 1 "aktiv"; -VAL_ 1624 LV_Nebellicht_Anzeige 0 "nicht aktiv" 1 "aktiv"; -VAL_ 1624 LV_Nebelschlusslicht_Anzeige 0 "nicht aktiv" 1 "aktiv"; -VAL_ 1624 LV_Tagfahrlicht_Anzeige 0 "nicht aktiv" 1 "aktiv"; -VAL_ 1624 LV_AFL_aktiv_Anzeige 0 "nicht aktiv" 1 "aktiv"; -VAL_ 1624 LV_AFL_defekt 0 "OK" 1 "defekt"; -VAL_ 1624 LV_Blinker_li_def 0 "OK" 1 "defekt"; -VAL_ 1624 LV_Standlicht_li_def 0 "OK" 1 "defekt"; -VAL_ 1624 LV_Abblendlicht_li_def 0 "OK" 1 "defekt"; -VAL_ 1624 LV_Fernlicht_li_def 0 "OK" 1 "defekt"; -VAL_ 1624 LV_Nebellicht_li_def 0 "OK" 1 "defekt"; -VAL_ 1624 LV_Blk_li_Seite_def 0 "OK" 1 "defekt"; -VAL_ 1624 LV_Tagfahrlicht_li_def 0 "OK" 1 "defekt"; -VAL_ 1624 LV_FLA_aktiv_Anzeige 0 "aus" 1 "ein"; -VAL_ 1624 LV_FLA_defekt 0 "i.O." 1 "FLA defekt"; -VAL_ 1624 LV_FLA_Sensor_blockiert 0 "i.O." 1 "FLA-Sensor blockiert"; -VAL_ 1624 LV_Blinker_re_def 0 "OK" 1 "defekt"; -VAL_ 1624 LV_Standlicht_re_def 0 "OK" 1 "defekt"; -VAL_ 1624 LV_Abblendlicht_re_def 0 "OK" 1 "defekt"; -VAL_ 1624 LV_Fernlicht_re_def 0 "OK" 1 "defekt"; -VAL_ 1624 LV_Nebellicht_re_def 0 "OK" 1 "defekt"; -VAL_ 1624 LV_Blk_re_Seite_def 0 "OK" 1 "defekt"; -VAL_ 1624 LV_Tagfahrlicht_re_def 0 "OK" 1 "defekt"; -VAL_ 1624 LV_Aussenlicht_def 0 "OK" 1 "defekt"; -VAL_ 1624 LV_Abblendlicht_TFL_li_def 0 "OK" 1 "defekt"; -VAL_ 1624 LV_Nebellicht_TFL_li_def 0 "OK" 1 "defekt"; -VAL_ 1624 LV_Standlicht_TFL_li_def 0 "OK" 1 "defekt"; -VAL_ 1624 LV_Abblend_Fernlicht_li_def 0 "OK" 1 "defekt"; -VAL_ 1624 LV_Abblendlicht_TFL_re_def 0 "OK" 1 "defekt"; -VAL_ 1624 LV_Nebellicht_TFL_re_def 0 "OK" 1 "defekt"; -VAL_ 1624 LV_Standlicht_TFL_re_def 0 "OK" 1 "defekt"; -VAL_ 1624 LV_Abblend_Fernlicht_re_def 0 "OK" 1 "defekt"; -VAL_ 1624 LV_Abbiegelicht_li_def 0 "OK" 1 "defekt"; -VAL_ 1624 LV_Abbiegelicht_re_def 0 "OK" 1 "defekt"; -VAL_ 1624 BCM1_Linksverkehr 0 "Rechtsverkehr" 1 "Linksverkehr"; -VAL_ 1624 BCM1_Licht_Dunkelheit_aktiv 0 "inaktiv" 1 "aktiv"; -VAL_ 1624 LV_LED_Scheinwerfer_li_def 0 "OK" 1 "defekt"; -VAL_ 1624 LV_LED_Scheinwerfer_re_def 0 "OK" 1 "defekt"; -VAL_ 1624 LV_Blinker_VL_aktiv 0 "inaktiv" 1 "aktiv"; -VAL_ 1624 LV_Blinker_VR_aktiv 0 "inaktiv" 1 "aktiv"; -VAL_ 1624 LV_MXB_Status_Anzeige 0 "MXB_aus" 1 "MXB_regelt" 2 "MXB_volles_Fernlicht" 3 "MXB_und_Laser_aktiv"; -VAL_ 1629 BR_Systemart 0 "ABS" 1 "ABS_ASR" 2 "ESP" 3 "ESP_mit_integrierter_EPB"; -VAL_ 1629 ESP_SpannungsAnf_02 0 "keine_Anforderung" 1 "Anforderung_Stufe1" 2 "Anforderung_Stufe2" 3 "Anforderung_Stufe3"; -VAL_ 1629 ESP_Charisma_FahrPr 0 "keine_Funktion" 1 "Programm_1" 2 "Programm_2" 3 "Programm_3" 4 "Programm_4" 5 "Programm_5" 6 "Programm_6" 7 "Programm_7" 8 "Programm_8" 9 "Programm_9" 10 "Programm_10" 11 "Programm_11" 12 "Programm_12" 13 "Programm_13" 14 "Programm_14" 15 "Programm_15"; -VAL_ 1629 ESP_Charisma_Status 0 "Init" 1 "verfuegbar" 2 "nicht_verfuegbar" 3 "asynchron_durch_Fahrerwunsch"; -VAL_ 1629 ESP_Wiederstart_Anz_01 0 "keine_Anzeige" 1 "Rueckwaertsrollen"; -VAL_ 1629 ESP_Wiederstart_Anz_02 0 "keine_Anzeige" 1 "Autohold_Rutschen"; -VAL_ 1629 ESP_Wiederstart_Anz_03 0 "keine_Anzeige" 1 "Offroad_HDC"; -VAL_ 1629 ESP_Wiederstart_Anz_04 0 "keine_Anzeige" 1 "ESC_Off"; -VAL_ 1629 ESP_Stoppverbot_Anz_01 0 "keine_Anzeige" 1 "Notbremsung_aktiv"; -VAL_ 1629 ESP_Stoppverbot_Anz_02 0 "keine_Anzeige" 1 "Autohold_AVH_Rutschen"; -VAL_ 1629 ESP_Stoppverbot_Anz_03 0 "keine_Anzeige" 1 "Rueckwaertsrollen"; -VAL_ 1629 ESP_Stoppverbot_Anz_04 0 "keine_Anzeige" 1 "ESP_Pumpenlauf"; -VAL_ 1629 ESP_Stoppverbot_Anz_05 0 "keine_Anzeige" 1 "ESP_OFF"; -VAL_ 1629 ESP_Stoppverbot_Anz_06 0 "keine_Anzeige" 1 "Offroad_HDC"; -VAL_ 1629 ESP_Stoppverbot_Anz_07 0 "keine_Anzeige" 1 "ESP_Haltefunktion_nicht_verfuegbar"; -VAL_ 1629 ESP_Stoppverbot_Anz_Std 0 "keine_Anzeige" 1 "Standard_Stoppvetogrund"; -VAL_ 1629 ESP_Dachrelingsensor 0 "Sensor_nicht_verbaut" 1 "Quertraeger_montiert" 2 "Quertraeger_nicht_montiert" 3 "Fehler"; -VAL_ 1629 ESP_Stoppverbot_Anz_08 0 "keine_Anzeige" 1 "Neigungsbegrenzung"; -VAL_ 1629 HDC_Charisma_FahrPr 0 "keine_Funktion" 1 "Programm_1" 2 "Programm_2" 3 "Programm_3" 4 "Programm_4" 5 "Programm_5" 6 "Programm_6" 7 "Programm_7" 8 "Programm_8" 9 "Programm_9" 10 "Programm_10" 11 "Programm_11" 12 "Programm_12" 13 "Programm_13" 14 "Programm_14" 15 "Programm_15"; -VAL_ 1629 HDC_Charisma_Status 0 "Init" 1 "verfuegbar" 2 "nicht_verfuegbar" 3 "asynchron_durch_Fahrerwunsch"; -VAL_ 1629 BR_QBit_Reifenumfang 0 "gueltiger_Wert" 1 "Ersatz_Init_oder_Fehlerwert"; -VAL_ 1631 TSK_QBit_Steigung 0 "gueltiger_Wert" 1 "Ersatz_Init_oder_Fehlerwert"; -VAL_ 1631 TSK_QBit_Fahrzeugmasse 0 "gueltiger_Wert" 1 "Ersatz_Init_oder_Fehlerwert"; -VAL_ 1631 MO_SpannungsAnf_02 0 "keine_Anforderung" 1 "Anforderung_Stufe_1" 2 "Anforderung_Stufe_2" 3 "Anforderung_Stufe_3"; -VAL_ 1631 MO_DPF_reg 0 "DPF_regeneriert_nicht" 1 "DPF_regeneriert"; -VAL_ 1631 MO_Heizstrom_EKAT 127 "Fehler"; -VAL_ 1631 MO_Heizstrom_SCR 63 "Fehler"; -VAL_ 1631 MO_Anzeige_Kaltleuchte 0 "Lampe_aus" 1 "Lampe_an"; -VAL_ 1631 MO_P_Generator_ungefiltert_Anf 0 "nicht_angefordert" 1 "angefordert"; -VAL_ 1631 TSK_Getriebeinfo 0 "Handschalter" 1 "AL_AQ_Getriebe" 2 "DL_DQ_Getriebe" 3 "CVT_Getriebe"; -VAL_ 1631 MO_Energieinhalt_BMS 4094 "Init" 4095 "Fehler"; -VAL_ 1631 TSK_Fahrzeugmasse_02 255 "Fehler"; -VAL_ 1631 TSK_Steigung_02 0 "Init_oder_nicht_verbaut" 255 "Fehler"; -VAL_ 1640 KL_LRH_Taster 0 "nicht_betaetigt" 1 "betaetigt"; -VAL_ 1640 KL_LRH_Stufe 0 "Stufe_niedrig" 1 "Stufe_mittel" 2 "Stufe_hoch" 3 "AUS"; -VAL_ 1640 HSH_Taster 0 "nicht_betaetigt" 1 "short_push" 2 "long_push" 3 "tbd"; -VAL_ 1640 FSH_Taster 0 "nicht_betaetigt" 1 "betaetigt"; -VAL_ 1640 KL_Zuheizer_Freigabe 0 "keine_Freigabe_Zuheizer" 1 "Zuheizerfreigabe"; -VAL_ 1640 KL_Beschlagsgefahr 0 "keine_Beschlagsgefahr" 1 "Beschlagsgefahr"; -VAL_ 1640 KRH_Soll_li 0 "aus" 1 "Stufe_1" 2 "Stufe_2" 3 "Stufe_3"; -VAL_ 1640 KRH_Soll_re 0 "aus" 1 "Stufe_1" 2 "Stufe_2" 3 "Stufe_3"; -VAL_ 1640 KL_Geblspng_Soll 0 "0V_Motorspannung" 252 "0V_sofort_Abschalten" 253 "0V_senken_mit_Rampe" 254 "reserviert" 255 "Fehler"; -VAL_ 1640 KL_Geblspng_Fond_Soll 0 "0V_Motorspannung" 252 "0V_sofort_Abschalten" 253 "0V_senken_mit_Rampe" 254 "reserviert" 255 "Fehler"; -VAL_ 1640 KL_I_Geblaese 255 "Fehler"; -VAL_ 1640 KL_Kompressorstrom_soll 1022 "Init" 1023 "Fehler"; -VAL_ 1640 KL_Umluftklappe_Status 0 "Frischluft" 1 "Teilumluft_10" 2 "Teilumluft_20" 3 "Teilumluft_30" 4 "Teilumluft_40" 5 "Teilumluft_50" 6 "Teilumluft_60" 7 "Teilumluft_70" 8 "Teilumluft_80" 9 "Teilumluft_90" 10 "Umluft" 14 "Init" 15 "Fehler"; -VAL_ 1640 KL_PTC_Verbauinfo 0 "kein_PTC" 1 "600W_geschaltet" 2 "1000W_geschaltet" 3 "1400W_LIN"; -VAL_ 1648 MO_ANC_Kennfeld_Anf 0 "Kennfeld_1" 1 "Uebergang_Kennfeld_2_nach_1" 2 "Uebergang_Kennfeld_1_nach_2" 3 "Kennfeld_2"; -VAL_ 1648 MO_Bremslicht_Reku 0 "Aus" 1 "Ein"; -VAL_ 1648 MO_StartStopp_PopUp 0 "Statuswechsel_ohne_Taster (Init)" 1 "StSt_per_Taster_deaktiviert" 2 "StSt_per_Taster_aktiviert" 3 "nicht verwendet"; -VAL_ 1648 MO1_Sperr_Info_WFS 0 "nicht_gesperrt" 1 "gesperrt"; -VAL_ 1648 MO1_Freigabe_Info_WFS 0 "ungueltig" 1 "gueltig"; -VAL_ 1648 MO_EPCL 0 "EPCL_aus_kein_Text" 1 "EPCL_gelb_Stoerung" 2 "EPCL_gelb_Leistungsbeschraenkung" 3 "EPCL_rot_Fzg_sicher_abstellen"; -VAL_ 1648 MO_Zylabsch_Texte_02 0 "ein_ZAS_generell_keine_ZAS_Anzeigen" 1 "ZAS_im_VMB" 2 "ZAS_im_ASB_1_Zyl_aktiv" 3 "ZAS_im_ASB_2_Zyl_aktiv" 4 "ZAS_im_ASB_3_Zyl_aktiv" 5 "ZAS_im_ASB_4_Zyl_aktiv" 6 "ZAS_im_ASB_5_Zyl_aktiv" 7 "ZAS_im_ASB_6_Zyl_aktiv" 8 "ZAS_im_ASB_8_Zyl_aktiv" 9 "ZAS_im_ASB_12_Zyl_aktiv" 13 "Uebergangsbetrieb" 14 "keine_ZAS_Anzeige_ggf_Stopp_Schub_Betrieb" 15 "ZAS_Stoerungs_Anzeige"; -VAL_ 1648 MO_Fahrzeugtyp 0 "Verbrenner_Fahrzeug" 1 "Hybrid" 2 "E_Fahrzeug" 3 "E_Fahrzeug_mit_Range_Extender" 4 "Brennstoffzellenfahrzeug" 5 "tbd" 6 "tbd" 7 "tbd"; -VAL_ 1648 MO_Abstellzeit 254 "Init" 255 "reserviert"; -VAL_ 1648 MO_Abstellzeit_Status 0 "Abstellzeit_nicht_berechnet" 1 "Abstellzeit_berechnet" 2 "Abstellzeit_Minimalwert" 3 "Abstellzeit_ungueltig"; -VAL_ 1648 MO1_Freigabe_Verfallsinfo_WFS 0 "verfaellt_nicht" 1 "verfaellt"; -VAL_ 1648 MO_Hybrid_StartStopp_LED 0 "LED_aus_und_Blinken_aus" 1 "LED_ein_und_Blinken_aus" 2 "LED_ein_und_Blinken_ein_50_percent" 3 "reserviert"; -VAL_ 1648 MO_Fehler_Zylabsch 0 "kein_Fehler" 1 "Notlauf_Vollmotorbetrieb" 2 "Notlauf_mindestens_einem_abgesch_Zylinder"; -VAL_ 1648 MO_Anzahl_Abgesch_Zyl 0 "Vollmotorbetrieb" 1 "1_Zylinder_abgeschaltet" 2 "2_Zylinder_abgeschaltet" 3 "3_Zylinder_abgeschaltet" 4 "4_Zylinder_abgeschaltet" 5 "5_Zylinder_abgeschaltet" 6 "6_Zylinder_abgeschaltet" 7 "8_Zylinder_abgeschaltet"; -VAL_ 1648 MO_Zylabsch_Texte 0 "keine_Texte" 1 "Zylinderabschaltung_deaktivieren" 2 "Zylinderabschaltung_aktivieren" 3 "Zylinderabschaltung_unruhig"; -VAL_ 1648 MO_Ethanol_BS_Texte 0 "kein_Text" 1 "E85_Warm_Up" 2 "FlexFuel_Warnung_Stufe_3" 3 "Warmfahrempfehlung_MQB__FlexFuel_Warnung_Stufe_1" 4 "FlexFuel_Warnung_Stufe_2" 5 "FlexFuel_Warnung_Stufe_4" 6 "E25_Warm_Up"; -VAL_ 1648 MO_Drehzahl_Warnung 0 "keinen_Warnhinweis_anzeigen" 1 "Warnhinweis_anzeigen"; -VAL_ 1648 MO_obere_Drehzahlgrenze 0 "Init"; -VAL_ 1710 SP_FT_oben 0 "nicht_betaetigt" 1 "betaetigt"; -VAL_ 1710 SP_FT_unten 0 "nicht_betaetigt" 1 "betaetigt"; -VAL_ 1710 SP_FT_links 0 "nicht_betaetigt" 1 "betaetigt"; -VAL_ 1710 SP_FT_rechts 0 "nicht_betaetigt" 1 "betaetigt"; -VAL_ 1710 SP_BT_oben 0 "nicht_betaetigt" 1 "betaetigt"; -VAL_ 1710 SP_BT_unten 0 "nicht_betaetigt" 1 "betaetigt"; -VAL_ 1710 SP_BT_links 0 "nicht_betaetigt" 1 "betaetigt"; -VAL_ 1710 SP_BT_rechts 0 "nicht_betaetigt" 1 "betaetigt"; -VAL_ 1710 SP_abklappen 0 "Spiegel_abklappen_nicht_aktiv" 1 "Spiegel_abklappen_aktiv"; -VAL_ 1710 SP_anklappen 0 "Spiegle_anklappen_nicht_aktiv" 1 "Spiegel_anklappen_aktiv"; -VAL_ 1710 SP_normieren 0 "Spiegel_nicht_normiert" 1 "Spiegel_normiert"; -VAL_ 1710 SP_Hzg_Taster 0 "nicht_betaetigt" 1 "betaetigt"; -VAL_ 1710 SP_S_oben 1 "Spiegelschalter in Stellung oben"; -VAL_ 1710 SP_S_unten 1 "Spiegelschalter in Stellung unten"; -VAL_ 1710 SP_S_links 1 "Spiegelschalter in Stellung links"; -VAL_ 1710 SP_S_rechts 1 "Spiegelschalter in Stellung rechts"; -VAL_ 1710 SP_Auswahl_li 1 "Spiegelschalter in Stellung Auswahl links"; -VAL_ 1710 SP_Auswahl_re 1 "Spiegelschalter in Stellung Auswahl rechts"; -VAL_ 1710 SP_ARA_Status 0 "TSG nicht im ARA-Modus" 1 "TSG im ARA-Modus"; -VAL_ 1710 SP_S_Klappen 1 "Spiegelschalter in Stellung Klappen"; -VAL_ 1710 SP_Verstellschalter_Fehler 0 "kein_Fehler" 1 "Fehler"; -VAL_ 1711 RV_Video_on 0 "Kamerabild wird nicht angezeigt" 1 "Kamerabild wird angezeigt"; -VAL_ 1711 RV_Dark_Screen 0 "Kamerabild nicht verdunkeln" 1 "Kamerabild verdunkeln"; -VAL_ 1711 RV_HMI_Mode 0 "Parkluecke (Modus 1)" 1 "Parallel zur Straߥ (Modus 2)" 2 "reserviert" 3 "Kalibrierung (nur Diagnose)"; -VAL_ 1711 RV_GL_side 0 "Guidelines_abgeschaltet" 1 "Guidelines_Anzeige_rechte_Seite" 2 "Guiedelines_Anzeige_linke_Seite" 3 "Guiedelines_Anzeige_beide_Seiten"; -VAL_ 1711 RV_System_aktiv 0 "System nicht betriebsbereit" 1 "System betriebsbereit"; -VAL_ 1711 RV_Reinigung_Anf 0 "nicht_reinigen" 1 "reinigen"; -VAL_ 1711 RV_Settings_enabled 0 "Menu 'Einstellungen' nicht aktiviert" 1 "Menu 'Einstellungen' aktiviert"; -VAL_ 1711 RV_Menu_Item 0 "HMI Mode als ausgewaehlt markiert" 1 "Helligkeit als ausgewaehlt markiert" 2 "Kontrast als ausgewaehlt markiert" 3 "Farbsaettigung als ausgewaehlt markiert"; -VAL_ 1711 SV_Video_on 0 "SideView_aus_/_nicht_verbaut" 1 "SideView_an"; -VAL_ 1711 RV_Calib_Fehler 0 "Kalibrierung_i.O." 1 "RearView_nicht_kalibriert"; -VAL_ 1711 RV_GL_Trailer_connect 0 "Guidelines_werden_angezeigt" 1 "Guidelines_wegen_angekoppeltem_Anh䮧er_deaktiviert"; -VAL_ 1711 RV_GL_Trunk_open 0 "Guidelines_werden_angezeigt" 1 "Guidelines_wegen_geöffneter_Heckklappe_deaktiviert"; -VAL_ 1711 RV_GL_LWS_Fehler 0 "Guidelines_werden_angezeigt" 1 "Guidelines_wegen_nicht_kalibriertem_Lenkwinkelsensor_deaktiviert"; -VAL_ 1711 ZFAS_Umfeldbeleuchtung_Anf 0 "nicht_angefordert" 1 "angefordert"; -VAL_ 1714 DGN_Verlernzaehler 255 "ungültiger Z䨬erstand oder kein gültiger Fahrzyklus"; -VAL_ 1714 UH_Monat 0 "Init" 14 "Relatives_Datum" 15 "Fehler"; -VAL_ 1714 UH_Tag 0 "Init"; -VAL_ 1714 Kombi_02_alt 0 "aktuell" 1 "veraltet"; -VAL_ 1714 Uhrzeit_01_alt 0 "aktuell" 1 "veraltet"; diff --git a/opendbc/dbc/vw_mqb_2010.dbc b/opendbc/dbc/vw_mqb_2010.dbc index 500f7c53676..cb6ea038897 100644 --- a/opendbc/dbc/vw_mqb_2010.dbc +++ b/opendbc/dbc/vw_mqb_2010.dbc @@ -1491,10 +1491,6 @@ BO_ 1123 PSD_05: 8 XXX BO_ 1124 PSD_06: 8 XXX BO_ 988 Gateway_73: 8 XXX - SG_ UNKNOWN_1 : 15|2@0+ (1,0) [0|3] "" XXX - SG_ GE_Fahrstufe : 40|4@1+ (1,0) [0|15] "" XXX - SG_ EPB_Status : 53|3@1+ (1,0) [0|7] "" XXX - SG_ UNKNOWN_2 : 58|3@0+ (1,0) [0|7] "" XXX BO_ 792 Kamera_Status: 8 XXX @@ -1761,8 +1757,6 @@ VAL_ 681 AWV_Warnlevel 0 "keine_Gefaehrdung" 63 "max_Gefaehrdung" ; VAL_ 391 MO_Waehlpos 2 "P" 3 "R" 4 "N" 5 "D" 6 "D" ; VAL_ 391 EV_Rekuperationsstufe 0 "default" 1 "B1" 2 "B2" 3 "B3" ; VAL_ 870 Fast_Send_Rate_Active 0 "1 Hz" 1 "50 Hz" ; -VAL_ 988 EPB_Status 0 "offen" 1 "geschlossen_Parken" 2 "teilgespannt_Halten" 3 "im_Lauf_oeffnen" 4 "im_Lauf_schliessen" 5 "tbd" 6 "Init" 7 "unbekannt"; -VAL_ 988 GE_Fahrstufe 0 "Zwischenstellung" 1 "Init" 5 "P" 6 "R" 7 "N" 8 "D" 9 "D" 10 "E" 13 "T" 14 "T" 15 "Fehler"; VAL_ 1720 KBI_Variante_USA 0 "keine USA-Variante" 1 "USA-Variante" ; VAL_ 1720 KBI_Variante 0 "Zeiger Kombiinstrument" 1 "Volldisplay Kombiinstrument" ; VAL_ 1720 KBI_BCmE_aktiv 0 "Anzeige_nicht_aktiv" 1 "Anzeige_aktiv" ; diff --git a/opendbc/safety/__init__.py b/opendbc/safety/__init__.py index ef90de3c5c8..509cafa2252 100644 --- a/opendbc/safety/__init__.py +++ b/opendbc/safety/__init__.py @@ -1,6 +1,32 @@ -# constants from panda/python/__init__.py -DLC_TO_LEN = [0, 1, 2, 3, 4, 5, 6, 7, 8, 12, 16, 20, 24, 32, 48, 64] -LEN_TO_DLC = {length: dlc for (dlc, length) in enumerate(DLC_TO_LEN)} +class Safety: + # matches opendbc.structs.CarParams.SafetyModel + # TODO: just use SafetyModel in panda repo + SAFETY_SILENT = 0 + SAFETY_HONDA_NIDEC = 1 + SAFETY_TOYOTA = 2 + SAFETY_ELM327 = 3 + SAFETY_GM = 4 + SAFETY_HONDA_BOSCH_GIRAFFE = 5 + SAFETY_FORD = 6 + SAFETY_HYUNDAI = 8 + SAFETY_CHRYSLER = 9 + SAFETY_TESLA = 10 + SAFETY_SUBARU = 11 + SAFETY_MAZDA = 13 + SAFETY_NISSAN = 14 + SAFETY_VOLKSWAGEN_MQB = 15 + SAFETY_ALLOUTPUT = 17 + SAFETY_GM_ASCM = 18 + SAFETY_NOOUTPUT = 19 + SAFETY_HONDA_BOSCH = 20 + SAFETY_VOLKSWAGEN_PQ = 21 + SAFETY_SUBARU_PREGLOBAL = 22 + SAFETY_HYUNDAI_LEGACY = 23 + SAFETY_HYUNDAI_COMMUNITY = 24 + SAFETY_STELLANTIS = 25 + SAFETY_FAW = 26 + SAFETY_BODY = 27 + SAFETY_HYUNDAI_CANFD = 28 class ALTERNATIVE_EXPERIENCE: diff --git a/opendbc/safety/board/can.h b/opendbc/safety/board/can.h deleted file mode 100644 index b2fe0ca39ff..00000000000 --- a/opendbc/safety/board/can.h +++ /dev/null @@ -1,4 +0,0 @@ -#pragma once -#include "can_declarations.h" - -static const unsigned char dlc_to_len[] = {0U, 1U, 2U, 3U, 4U, 5U, 6U, 7U, 8U, 12U, 16U, 20U, 24U, 32U, 48U, 64U}; diff --git a/opendbc/safety/board/can_declarations.h b/opendbc/safety/board/can_declarations.h deleted file mode 100644 index 186cba1fc25..00000000000 --- a/opendbc/safety/board/can_declarations.h +++ /dev/null @@ -1,27 +0,0 @@ -#pragma once - -#define CANPACKET_HEAD_SIZE 6U - -// TODO: this is always CANFD -#if !defined(STM32F4) - #define CANFD - #define CANPACKET_DATA_SIZE_MAX 64U -#else - #define CANPACKET_DATA_SIZE_MAX 8U -#endif - -typedef struct { - unsigned char fd : 1; - unsigned char bus : 3; - unsigned char data_len_code : 4; // lookup length with dlc_to_len - unsigned char rejected : 1; - unsigned char returned : 1; - unsigned char extended : 1; - unsigned int addr : 29; - unsigned char checksum; - unsigned char data[CANPACKET_DATA_SIZE_MAX]; -} __attribute__((packed, aligned(4))) CANPacket_t; - -#define GET_BUS(msg) ((msg)->bus) -#define GET_LEN(msg) (dlc_to_len[(msg)->data_len_code]) -#define GET_ADDR(msg) ((msg)->addr) diff --git a/opendbc/safety/board/drivers/can_common.h b/opendbc/safety/board/drivers/can_common.h deleted file mode 100644 index 52a980cf1d4..00000000000 --- a/opendbc/safety/board/drivers/can_common.h +++ /dev/null @@ -1,18 +0,0 @@ -#include "can_common_declarations.h" - -uint8_t calculate_checksum(const uint8_t *dat, uint32_t len) { - uint8_t checksum = 0U; - for (uint32_t i = 0U; i < len; i++) { - checksum ^= dat[i]; - } - return checksum; -} - -void can_set_checksum(CANPacket_t *packet) { - packet->checksum = 0U; - packet->checksum = calculate_checksum((uint8_t *) packet, CANPACKET_HEAD_SIZE + GET_LEN(packet)); -} - -bool can_check_checksum(CANPacket_t *packet) { - return (calculate_checksum((uint8_t *) packet, CANPACKET_HEAD_SIZE + GET_LEN(packet)) == 0U); -} diff --git a/opendbc/safety/board/drivers/can_common_declarations.h b/opendbc/safety/board/drivers/can_common_declarations.h deleted file mode 100644 index c05df042ef0..00000000000 --- a/opendbc/safety/board/drivers/can_common_declarations.h +++ /dev/null @@ -1,4 +0,0 @@ -#pragma once - -uint8_t calculate_checksum(const uint8_t *dat, uint32_t len); -void can_set_checksum(CANPacket_t *packet); diff --git a/opendbc/safety/board/fake_stm.h b/opendbc/safety/board/fake_stm.h deleted file mode 100644 index 8f94e79edcd..00000000000 --- a/opendbc/safety/board/fake_stm.h +++ /dev/null @@ -1,29 +0,0 @@ -// minimal code to fake a panda for tests -#include -#include -#include - -#include "utils.h" - -#define ALLOW_DEBUG -#define PANDA - -void print(const char *a) { - printf("%s", a); -} - -void puth(unsigned int i) { - printf("%u", i); -} - -typedef struct { - uint32_t CNT; -} TIM_TypeDef; - -TIM_TypeDef timer; -TIM_TypeDef *MICROSECOND_TIMER = &timer; -uint32_t microsecond_timer_get(void); - -uint32_t microsecond_timer_get(void) { - return MICROSECOND_TIMER->CNT; -} diff --git a/opendbc/safety/board/faults.h b/opendbc/safety/board/faults.h deleted file mode 100644 index 0fc9d2c5cfb..00000000000 --- a/opendbc/safety/board/faults.h +++ /dev/null @@ -1,25 +0,0 @@ -#include "faults_declarations.h" - -uint8_t fault_status = FAULT_STATUS_NONE; -uint32_t faults = 0U; - -void fault_occurred(uint32_t fault) { - if ((faults & fault) == 0U) { - if ((PERMANENT_FAULTS & fault) != 0U) { - print("Permanent fault occurred: 0x"); puth(fault); print("\n"); - fault_status = FAULT_STATUS_PERMANENT; - } else { - print("Temporary fault occurred: 0x"); puth(fault); print("\n"); - fault_status = FAULT_STATUS_TEMPORARY; - } - } - faults |= fault; -} - -void fault_recovered(uint32_t fault) { - if ((PERMANENT_FAULTS & fault) == 0U) { - faults &= ~fault; - } else { - print("Cannot recover from a permanent fault!\n"); - } -} diff --git a/opendbc/safety/board/faults_declarations.h b/opendbc/safety/board/faults_declarations.h deleted file mode 100644 index a023d7e7173..00000000000 --- a/opendbc/safety/board/faults_declarations.h +++ /dev/null @@ -1,18 +0,0 @@ -#pragma once - -#define FAULT_STATUS_NONE 0U -#define FAULT_STATUS_TEMPORARY 1U -#define FAULT_STATUS_PERMANENT 2U - -// Fault types, excerpt from cereal.log.PandaState.FaultType for safety tests -#define FAULT_RELAY_MALFUNCTION (1UL << 0) -// ... - -// Permanent faults -#define PERMANENT_FAULTS 0U - -extern uint8_t fault_status; -extern uint32_t faults; - -void fault_occurred(uint32_t fault); -void fault_recovered(uint32_t fault); diff --git a/opendbc/safety/board/utils.h b/opendbc/safety/board/utils.h deleted file mode 100644 index f355ce8c2f2..00000000000 --- a/opendbc/safety/board/utils.h +++ /dev/null @@ -1,47 +0,0 @@ -// cppcheck-suppress-macro misra-c2012-1.2; allow __typeof__ extension -#define MIN(a, b) ({ \ - __typeof__ (a) _a = (a); \ - __typeof__ (b) _b = (b); \ - (_a < _b) ? _a : _b; \ -}) - -// cppcheck-suppress-macro misra-c2012-1.2; allow __typeof__ extension -#define MAX(a, b) ({ \ - __typeof__ (a) _a = (a); \ - __typeof__ (b) _b = (b); \ - (_a > _b) ? _a : _b; \ -}) - -// cppcheck-suppress-macro misra-c2012-1.2; allow __typeof__ extension -#define CLAMP(x, low, high) ({ \ - __typeof__(x) __x = (x); \ - __typeof__(low) __low = (low);\ - __typeof__(high) __high = (high);\ - (__x > __high) ? __high : ((__x < __low) ? __low : __x); \ -}) - -// cppcheck-suppress-macro misra-c2012-1.2; allow __typeof__ extension -#define ABS(a) ({ \ - __typeof__ (a) _a = (a); \ - (_a > 0) ? _a : (-_a); \ -}) - -#ifndef NULL -// this just provides a standard implementation of NULL -// in lieu of including libc in the panda build -// cppcheck-suppress [misra-c2012-21.1] -#define NULL ((void*)0) -#endif - -// STM32 HAL defines this -#ifndef UNUSED -#define UNUSED(x) ((void)(x)) -#endif - -#define COMPILE_TIME_ASSERT(pred) ((void)sizeof(char[1 - (2 * (!(pred) ? 1 : 0))])) - -// compute the time elapsed (in microseconds) from 2 counter samples -// case where ts < ts_last is ok: overflow is properly re-casted into uint32_t -uint32_t get_ts_elapsed(uint32_t ts, uint32_t ts_last) { - return ts - ts_last; -} diff --git a/opendbc/safety/main.c b/opendbc/safety/main.c deleted file mode 100644 index 3c873f84c28..00000000000 --- a/opendbc/safety/main.c +++ /dev/null @@ -1,12 +0,0 @@ -#include "safety.h" - -// this file is checked by cppcheck - -// Ignore misra-c2012-8.7 as these functions are only called from panda and libsafety -UNUSED(heartbeat_engaged); - -UNUSED(safety_rx_hook); -UNUSED(safety_tx_hook); -UNUSED(safety_fwd_hook); -UNUSED(safety_tick); -UNUSED(set_safety_hooks); diff --git a/opendbc/safety/safety.h b/opendbc/safety/safety.h deleted file mode 100644 index a36f280ae6d..00000000000 --- a/opendbc/safety/safety.h +++ /dev/null @@ -1,798 +0,0 @@ -#pragma once - -#include "safety_declarations.h" -#include "can.h" - -// include the safety policies. -#include "safety/safety_defaults.h" -#include "safety/safety_honda.h" -#include "safety/safety_toyota.h" -#include "safety/safety_tesla.h" -#include "safety/safety_gm.h" -#include "safety/safety_ford.h" -#include "safety/safety_hyundai.h" -#include "safety/safety_chrysler.h" -#include "safety/safety_rivian.h" -#include "safety/safety_subaru.h" -#include "safety/safety_subaru_preglobal.h" -#include "safety/safety_mazda.h" -#include "safety/safety_nissan.h" -#include "safety/safety_volkswagen_mqb.h" -#include "safety/safety_volkswagen_pq.h" -#include "safety/safety_elm327.h" -#include "safety/safety_body.h" - -// CAN-FD only safety modes -#ifdef CANFD -#include "safety/safety_hyundai_canfd.h" -#endif - -// from cereal.car.CarParams.SafetyModel -#define SAFETY_SILENT 0U -#define SAFETY_HONDA_NIDEC 1U -#define SAFETY_TOYOTA 2U -#define SAFETY_ELM327 3U -#define SAFETY_GM 4U -#define SAFETY_HONDA_BOSCH_GIRAFFE 5U -#define SAFETY_FORD 6U -#define SAFETY_HYUNDAI 8U -#define SAFETY_CHRYSLER 9U -#define SAFETY_TESLA 10U -#define SAFETY_SUBARU 11U -#define SAFETY_MAZDA 13U -#define SAFETY_NISSAN 14U -#define SAFETY_VOLKSWAGEN_MQB 15U -#define SAFETY_ALLOUTPUT 17U -#define SAFETY_GM_ASCM 18U -#define SAFETY_NOOUTPUT 19U -#define SAFETY_HONDA_BOSCH 20U -#define SAFETY_VOLKSWAGEN_PQ 21U -#define SAFETY_SUBARU_PREGLOBAL 22U -#define SAFETY_HYUNDAI_LEGACY 23U -#define SAFETY_HYUNDAI_COMMUNITY 24U -#define SAFETY_STELLANTIS 25U -#define SAFETY_FAW 26U -#define SAFETY_BODY 27U -#define SAFETY_HYUNDAI_CANFD 28U -#define SAFETY_RIVIAN 33U -#define SAFETY_VOLKSWAGEN_MEB 34U - -uint32_t GET_BYTES(const CANPacket_t *msg, int start, int len) { - uint32_t ret = 0U; - for (int i = 0; i < len; i++) { - const uint32_t shift = i * 8; - ret |= (((uint32_t)msg->data[start + i]) << shift); - } - return ret; -} - -const int MAX_WRONG_COUNTERS = 5; - -// This can be set by the safety hooks -bool controls_allowed = false; -bool relay_malfunction = false; -bool gas_pressed = false; -bool gas_pressed_prev = false; -bool brake_pressed = false; -bool brake_pressed_prev = false; -bool regen_braking = false; -bool regen_braking_prev = false; -bool cruise_engaged_prev = false; -struct sample_t vehicle_speed; -bool vehicle_moving = false; -bool acc_main_on = false; // referred to as "ACC off" in ISO 15622:2018 -int cruise_button_prev = 0; -bool safety_rx_checks_invalid = false; - -// for safety modes with torque steering control -int desired_torque_last = 0; // last desired steer torque -int rt_torque_last = 0; // last desired torque for real time check -int valid_steer_req_count = 0; // counter for steer request bit matching non-zero torque -int invalid_steer_req_count = 0; // counter to allow multiple frames of mismatching torque request bit -struct sample_t torque_meas; // last 6 motor torques produced by the eps -struct sample_t torque_driver; // last 6 driver torques measured -uint32_t ts_torque_check_last = 0; -uint32_t ts_steer_req_mismatch_last = 0; // last timestamp steer req was mismatched with torque - -// state for controls_allowed timeout logic -bool heartbeat_engaged = false; // openpilot enabled, passed in heartbeat USB command -uint32_t heartbeat_engaged_mismatches = 0; // count of mismatches between heartbeat_engaged and controls_allowed - -// for safety modes with angle steering control -uint32_t ts_angle_last = 0; -int desired_angle_last = 0; -struct sample_t angle_meas; // last 6 steer angles/curvatures - - -int alternative_experience = 0; - -// time since safety mode has been changed -uint32_t safety_mode_cnt = 0U; - -uint16_t current_safety_mode = SAFETY_SILENT; -uint16_t current_safety_param = 0; -static const safety_hooks *current_hooks = &nooutput_hooks; -safety_config current_safety_config; - -static bool is_msg_valid(RxCheck addr_list[], int index) { - bool valid = true; - if (index != -1) { - if (!addr_list[index].status.valid_checksum || !addr_list[index].status.valid_quality_flag || (addr_list[index].status.wrong_counters >= MAX_WRONG_COUNTERS)) { - valid = false; - controls_allowed = false; - } - } - return valid; -} - -static int get_addr_check_index(const CANPacket_t *to_push, RxCheck addr_list[], const int len) { - int bus = GET_BUS(to_push); - int addr = GET_ADDR(to_push); - int length = GET_LEN(to_push); - - int index = -1; - for (int i = 0; i < len; i++) { - // if multiple msgs are allowed, determine which one is present on the bus - if (!addr_list[i].status.msg_seen) { - for (uint8_t j = 0U; (j < MAX_ADDR_CHECK_MSGS) && (addr_list[i].msg[j].addr != 0); j++) { - if ((addr == addr_list[i].msg[j].addr) && (bus == addr_list[i].msg[j].bus) && - (length == addr_list[i].msg[j].len)) { - addr_list[i].status.index = j; - addr_list[i].status.msg_seen = true; - break; - } - } - } - - if (addr_list[i].status.msg_seen) { - int idx = addr_list[i].status.index; - if ((addr == addr_list[i].msg[idx].addr) && (bus == addr_list[i].msg[idx].bus) && - (length == addr_list[i].msg[idx].len)) { - index = i; - break; - } - } - } - return index; -} - -static void update_addr_timestamp(RxCheck addr_list[], int index) { - if (index != -1) { - uint32_t ts = microsecond_timer_get(); - addr_list[index].status.last_timestamp = ts; - } -} - -static void update_counter(RxCheck addr_list[], int index, uint8_t counter) { - if (index != -1) { - uint8_t expected_counter = (addr_list[index].status.last_counter + 1U) % (addr_list[index].msg[addr_list[index].status.index].max_counter + 1U); - addr_list[index].status.wrong_counters += (expected_counter == counter) ? -1 : 1; - addr_list[index].status.wrong_counters = CLAMP(addr_list[index].status.wrong_counters, 0, MAX_WRONG_COUNTERS); - addr_list[index].status.last_counter = counter; - } -} - -static bool rx_msg_safety_check(const CANPacket_t *to_push, - const safety_config *cfg, - const safety_hooks *safety_hooks) { - - int index = get_addr_check_index(to_push, cfg->rx_checks, cfg->rx_checks_len); - update_addr_timestamp(cfg->rx_checks, index); - - if (index != -1) { - // checksum check - if ((safety_hooks->get_checksum != NULL) && (safety_hooks->compute_checksum != NULL) && !cfg->rx_checks[index].msg[cfg->rx_checks[index].status.index].ignore_checksum) { - uint32_t checksum = safety_hooks->get_checksum(to_push); - uint32_t checksum_comp = safety_hooks->compute_checksum(to_push); - cfg->rx_checks[index].status.valid_checksum = checksum_comp == checksum; - } else { - cfg->rx_checks[index].status.valid_checksum = cfg->rx_checks[index].msg[cfg->rx_checks[index].status.index].ignore_checksum; - } - - // counter check - if ((safety_hooks->get_counter != NULL) && (cfg->rx_checks[index].msg[cfg->rx_checks[index].status.index].max_counter > 0U)) { - uint8_t counter = safety_hooks->get_counter(to_push); - update_counter(cfg->rx_checks, index, counter); - } else { - cfg->rx_checks[index].status.wrong_counters = cfg->rx_checks[index].msg[cfg->rx_checks[index].status.index].ignore_counter ? 0 : MAX_WRONG_COUNTERS; - } - - // quality flag check - if ((safety_hooks->get_quality_flag_valid != NULL) && cfg->rx_checks[index].msg[cfg->rx_checks[index].status.index].quality_flag) { - cfg->rx_checks[index].status.valid_quality_flag = safety_hooks->get_quality_flag_valid(to_push); - } else { - cfg->rx_checks[index].status.valid_quality_flag = true; - } - } - return is_msg_valid(cfg->rx_checks, index); -} - -bool safety_rx_hook(const CANPacket_t *to_push) { - bool controls_allowed_prev = controls_allowed; - - bool valid = rx_msg_safety_check(to_push, ¤t_safety_config, current_hooks); - if (valid) { - current_hooks->rx(to_push); - } - - // reset mismatches on rising edge of controls_allowed to avoid rare race condition - if (controls_allowed && !controls_allowed_prev) { - heartbeat_engaged_mismatches = 0; - } - - return valid; -} - -static bool tx_msg_safety_check(const CANPacket_t *to_send, const CanMsg msg_list[], int len) { - int addr = GET_ADDR(to_send); - int bus = GET_BUS(to_send); - int length = GET_LEN(to_send); - - bool allowed = false; - for (int i = 0; i < len; i++) { - if ((addr == msg_list[i].addr) && (bus == msg_list[i].bus) && (length == msg_list[i].len)) { - allowed = true; - break; - } - } - return allowed; -} - -bool safety_tx_hook(CANPacket_t *to_send) { - bool allowed = tx_msg_safety_check(to_send, current_safety_config.tx_msgs, current_safety_config.tx_msgs_len); - if ((current_safety_mode == SAFETY_ALLOUTPUT) || (current_safety_mode == SAFETY_ELM327)) { - allowed = true; - } - - bool safety_allowed = false; - if (allowed) { - safety_allowed = current_hooks->tx(to_send); - } - - return !relay_malfunction && allowed && safety_allowed; -} - -int safety_fwd_hook(int bus_num, int addr) { - return (relay_malfunction ? -1 : current_hooks->fwd(bus_num, addr)); -} - -bool get_longitudinal_allowed(void) { - return controls_allowed && !gas_pressed_prev; -} - -// Given a CRC-8 poly, generate a static lookup table to use with a fast CRC-8 -// algorithm. Called at init time for safety modes using CRC-8. -void gen_crc_lookup_table_8(uint8_t poly, uint8_t crc_lut[]) { - for (uint16_t i = 0U; i <= 0xFFU; i++) { - uint8_t crc = (uint8_t)i; - for (int j = 0; j < 8; j++) { - if ((crc & 0x80U) != 0U) { - crc = (uint8_t)((crc << 1) ^ poly); - } else { - crc <<= 1; - } - } - crc_lut[i] = crc; - } -} - -#ifdef CANFD -void gen_crc_lookup_table_16(uint16_t poly, uint16_t crc_lut[]) { - for (uint16_t i = 0; i < 256U; i++) { - uint16_t crc = i << 8U; - for (uint16_t j = 0; j < 8U; j++) { - if ((crc & 0x8000U) != 0U) { - crc = (uint16_t)((crc << 1) ^ poly); - } else { - crc <<= 1; - } - } - crc_lut[i] = crc; - } -} -#endif - -// 1Hz safety function called by main. Now just a check for lagging safety messages -void safety_tick(const safety_config *cfg) { - const uint8_t MAX_MISSED_MSGS = 10U; - bool rx_checks_invalid = false; - uint32_t ts = microsecond_timer_get(); - if (cfg != NULL) { - for (int i=0; i < cfg->rx_checks_len; i++) { - uint32_t elapsed_time = get_ts_elapsed(ts, cfg->rx_checks[i].status.last_timestamp); - // lag threshold is max of: 1s and MAX_MISSED_MSGS * expected timestep. - // Quite conservative to not risk false triggers. - // 2s of lag is worse case, since the function is called at 1Hz - uint32_t timestep = 1e6 / cfg->rx_checks[i].msg[cfg->rx_checks[i].status.index].frequency; - bool lagging = elapsed_time > MAX(timestep * MAX_MISSED_MSGS, 1e6); - cfg->rx_checks[i].status.lagging = lagging; - if (lagging) { - controls_allowed = false; - } - - if (lagging || !is_msg_valid(cfg->rx_checks, i)) { - rx_checks_invalid = true; - } - } - } - - safety_rx_checks_invalid = rx_checks_invalid; -} - -static void relay_malfunction_set(void) { - relay_malfunction = true; - fault_occurred(FAULT_RELAY_MALFUNCTION); -} - -void generic_rx_checks(bool stock_ecu_detected) { - // allow 1s of transition timeout after relay changes state before assessing malfunctioning - const uint32_t RELAY_TRNS_TIMEOUT = 1U; - - // exit controls on rising edge of gas press - if (gas_pressed && !gas_pressed_prev && !(alternative_experience & ALT_EXP_DISABLE_DISENGAGE_ON_GAS)) { - controls_allowed = false; - } - gas_pressed_prev = gas_pressed; - - // exit controls on rising edge of brake press - if (brake_pressed && (!brake_pressed_prev || vehicle_moving)) { - controls_allowed = false; - } - brake_pressed_prev = brake_pressed; - - // exit controls on rising edge of regen paddle - if (regen_braking && (!regen_braking_prev || vehicle_moving)) { - controls_allowed = false; - } - regen_braking_prev = regen_braking; - - // check if stock ECU is on bus broken by car harness - if ((safety_mode_cnt > RELAY_TRNS_TIMEOUT) && stock_ecu_detected) { - relay_malfunction_set(); - } -} - -static void relay_malfunction_reset(void) { - relay_malfunction = false; - fault_recovered(FAULT_RELAY_MALFUNCTION); -} - -// resets values and min/max for sample_t struct -static void reset_sample(struct sample_t *sample) { - for (int i = 0; i < MAX_SAMPLE_VALS; i++) { - sample->values[i] = 0; - } - update_sample(sample, 0); -} - -int set_safety_hooks(uint16_t mode, uint16_t param) { - const safety_hook_config safety_hook_registry[] = { - {SAFETY_SILENT, &nooutput_hooks}, - {SAFETY_HONDA_NIDEC, &honda_nidec_hooks}, - {SAFETY_TOYOTA, &toyota_hooks}, - {SAFETY_ELM327, &elm327_hooks}, - {SAFETY_GM, &gm_hooks}, - {SAFETY_HONDA_BOSCH, &honda_bosch_hooks}, - {SAFETY_HYUNDAI, &hyundai_hooks}, - {SAFETY_CHRYSLER, &chrysler_hooks}, - {SAFETY_SUBARU, &subaru_hooks}, - {SAFETY_VOLKSWAGEN_MQB, &volkswagen_mqb_hooks}, - {SAFETY_NISSAN, &nissan_hooks}, - {SAFETY_NOOUTPUT, &nooutput_hooks}, - {SAFETY_HYUNDAI_LEGACY, &hyundai_legacy_hooks}, - {SAFETY_MAZDA, &mazda_hooks}, - {SAFETY_BODY, &body_hooks}, - {SAFETY_FORD, &ford_hooks}, - {SAFETY_RIVIAN, &rivian_hooks}, -#ifdef CANFD - {SAFETY_HYUNDAI_CANFD, &hyundai_canfd_hooks}, -#endif -#ifdef ALLOW_DEBUG - {SAFETY_TESLA, &tesla_hooks}, - {SAFETY_SUBARU_PREGLOBAL, &subaru_preglobal_hooks}, - {SAFETY_VOLKSWAGEN_PQ, &volkswagen_pq_hooks}, - {SAFETY_ALLOUTPUT, &alloutput_hooks}, -#endif - }; - - // reset state set by safety mode - safety_mode_cnt = 0U; - relay_malfunction = false; - gas_pressed = false; - gas_pressed_prev = false; - brake_pressed = false; - brake_pressed_prev = false; - regen_braking = false; - regen_braking_prev = false; - cruise_engaged_prev = false; - vehicle_moving = false; - acc_main_on = false; - cruise_button_prev = 0; - desired_torque_last = 0; - rt_torque_last = 0; - ts_angle_last = 0; - desired_angle_last = 0; - ts_torque_check_last = 0; - ts_steer_req_mismatch_last = 0; - valid_steer_req_count = 0; - invalid_steer_req_count = 0; - - // reset samples - reset_sample(&vehicle_speed); - reset_sample(&torque_meas); - reset_sample(&torque_driver); - reset_sample(&angle_meas); - - controls_allowed = false; - relay_malfunction_reset(); - safety_rx_checks_invalid = false; - - current_safety_config.rx_checks = NULL; - current_safety_config.rx_checks_len = 0; - current_safety_config.tx_msgs = NULL; - current_safety_config.tx_msgs_len = 0; - - int set_status = -1; // not set - int hook_config_count = sizeof(safety_hook_registry) / sizeof(safety_hook_config); - for (int i = 0; i < hook_config_count; i++) { - if (safety_hook_registry[i].id == mode) { - current_hooks = safety_hook_registry[i].hooks; - current_safety_mode = mode; - current_safety_param = param; - set_status = 0; // set - } - } - if ((set_status == 0) && (current_hooks->init != NULL)) { - safety_config cfg = current_hooks->init(param); - current_safety_config.rx_checks = cfg.rx_checks; - current_safety_config.rx_checks_len = cfg.rx_checks_len; - current_safety_config.tx_msgs = cfg.tx_msgs; - current_safety_config.tx_msgs_len = cfg.tx_msgs_len; - // reset all dynamic fields in addr struct - for (int j = 0; j < current_safety_config.rx_checks_len; j++) { - current_safety_config.rx_checks[j].status = (RxStatus){0}; - } - } - return set_status; -} - -// convert a trimmed integer to signed 32 bit int -int to_signed(int d, int bits) { - int d_signed = d; - int max_value = (1 << MAX((bits - 1), 0)); - if (d >= max_value) { - d_signed = d - (1 << MAX(bits, 0)); - } - return d_signed; -} - -// given a new sample, update the sample_t struct -void update_sample(struct sample_t *sample, int sample_new) { - for (int i = MAX_SAMPLE_VALS - 1; i > 0; i--) { - sample->values[i] = sample->values[i-1]; - } - sample->values[0] = sample_new; - - // get the minimum and maximum measured samples - sample->min = sample->values[0]; - sample->max = sample->values[0]; - for (int i = 1; i < MAX_SAMPLE_VALS; i++) { - if (sample->values[i] < sample->min) { - sample->min = sample->values[i]; - } - if (sample->values[i] > sample->max) { - sample->max = sample->values[i]; - } - } -} - -static bool max_limit_check(int val, const int MAX_VAL, const int MIN_VAL) { - return (val > MAX_VAL) || (val < MIN_VAL); -} - -// check that commanded torque value isn't too far from measured -static bool dist_to_meas_check(int val, int val_last, struct sample_t *val_meas, - const int MAX_RATE_UP, const int MAX_RATE_DOWN, const int MAX_ERROR) { - - // *** val rate limit check *** - int highest_allowed_rl = MAX(val_last, 0) + MAX_RATE_UP; - int lowest_allowed_rl = MIN(val_last, 0) - MAX_RATE_UP; - - // if we've exceeded the meas val, we must start moving toward 0 - int highest_allowed = MIN(highest_allowed_rl, MAX(val_last - MAX_RATE_DOWN, MAX(val_meas->max, 0) + MAX_ERROR)); - int lowest_allowed = MAX(lowest_allowed_rl, MIN(val_last + MAX_RATE_DOWN, MIN(val_meas->min, 0) - MAX_ERROR)); - - // check for violation - return max_limit_check(val, highest_allowed, lowest_allowed); -} - -// check that commanded value isn't fighting against driver -static bool driver_limit_check(int val, int val_last, const struct sample_t *val_driver, - const int MAX_VAL, const int MAX_RATE_UP, const int MAX_RATE_DOWN, - const int MAX_ALLOWANCE, const int DRIVER_FACTOR) { - - // torque delta/rate limits - int highest_allowed_rl = MAX(val_last, 0) + MAX_RATE_UP; - int lowest_allowed_rl = MIN(val_last, 0) - MAX_RATE_UP; - - // driver - int driver_max_limit = MAX_VAL + (MAX_ALLOWANCE + val_driver->max) * DRIVER_FACTOR; - int driver_min_limit = -MAX_VAL + (-MAX_ALLOWANCE + val_driver->min) * DRIVER_FACTOR; - - // if we've exceeded the applied torque, we must start moving toward 0 - int highest_allowed = MIN(highest_allowed_rl, MAX(val_last - MAX_RATE_DOWN, - MAX(driver_max_limit, 0))); - int lowest_allowed = MAX(lowest_allowed_rl, MIN(val_last + MAX_RATE_DOWN, - MIN(driver_min_limit, 0))); - - // check for violation - return max_limit_check(val, highest_allowed, lowest_allowed); -} - - -// real time check, mainly used for steer torque rate limiter -static bool rt_rate_limit_check(int val, int val_last, const int MAX_RT_DELTA) { - - // *** torque real time rate limit check *** - int highest_val = MAX(val_last, 0) + MAX_RT_DELTA; - int lowest_val = MIN(val_last, 0) - MAX_RT_DELTA; - - // check for violation - return max_limit_check(val, highest_val, lowest_val); -} - - -// interp function that holds extreme values -static float interpolate(struct lookup_t xy, float x) { - - int size = sizeof(xy.x) / sizeof(xy.x[0]); - float ret = xy.y[size - 1]; // default output is last point - - // x is lower than the first point in the x array. Return the first point - if (x <= xy.x[0]) { - ret = xy.y[0]; - - } else { - // find the index such that (xy.x[i] <= x < xy.x[i+1]) and linearly interp - for (int i=0; i < (size - 1); i++) { - if (x < xy.x[i+1]) { - float x0 = xy.x[i]; - float y0 = xy.y[i]; - float dx = xy.x[i+1] - x0; - float dy = xy.y[i+1] - y0; - // dx should not be zero as xy.x is supposed to be monotonic - dx = MAX(dx, 0.0001); - ret = (dy * (x - x0) / dx) + y0; - break; - } - } - } - return ret; -} - -int ROUND(float val) { - return val + ((val > 0.0) ? 0.5 : -0.5); -} - -// Safety checks for longitudinal actuation -bool longitudinal_accel_checks(int desired_accel, const LongitudinalLimits limits) { - bool accel_valid = get_longitudinal_allowed() && !max_limit_check(desired_accel, limits.max_accel, limits.min_accel); - bool accel_inactive = desired_accel == limits.inactive_accel; - return !(accel_valid || accel_inactive); -} - -bool longitudinal_speed_checks(int desired_speed, const LongitudinalLimits limits) { - return !get_longitudinal_allowed() && (desired_speed != limits.inactive_speed); -} - -bool longitudinal_transmission_rpm_checks(int desired_transmission_rpm, const LongitudinalLimits limits) { - bool transmission_rpm_valid = get_longitudinal_allowed() && !max_limit_check(desired_transmission_rpm, limits.max_transmission_rpm, limits.min_transmission_rpm); - bool transmission_rpm_inactive = desired_transmission_rpm == limits.inactive_transmission_rpm; - return !(transmission_rpm_valid || transmission_rpm_inactive); -} - -bool longitudinal_gas_checks(int desired_gas, const LongitudinalLimits limits) { - bool gas_valid = get_longitudinal_allowed() && !max_limit_check(desired_gas, limits.max_gas, limits.min_gas); - bool gas_inactive = desired_gas == limits.inactive_gas; - return !(gas_valid || gas_inactive); -} - -bool longitudinal_brake_checks(int desired_brake, const LongitudinalLimits limits) { - bool violation = false; - violation |= !get_longitudinal_allowed() && (desired_brake != 0); - violation |= desired_brake > limits.max_brake; - return violation; -} - -// Safety checks for torque-based steering commands -bool steer_torque_cmd_checks(int desired_torque, int steer_req, const TorqueSteeringLimits limits) { - bool violation = false; - uint32_t ts = microsecond_timer_get(); - - if (controls_allowed) { - // *** global torque limit check *** - violation |= max_limit_check(desired_torque, limits.max_steer, -limits.max_steer); - - // *** torque rate limit check *** - if (limits.type == TorqueDriverLimited) { - violation |= driver_limit_check(desired_torque, desired_torque_last, &torque_driver, - limits.max_steer, limits.max_rate_up, limits.max_rate_down, - limits.driver_torque_allowance, limits.driver_torque_multiplier); - } else { - violation |= dist_to_meas_check(desired_torque, desired_torque_last, &torque_meas, - limits.max_rate_up, limits.max_rate_down, limits.max_torque_error); - } - desired_torque_last = desired_torque; - - // *** torque real time rate limit check *** - violation |= rt_rate_limit_check(desired_torque, rt_torque_last, limits.max_rt_delta); - - // every RT_INTERVAL set the new limits - uint32_t ts_elapsed = get_ts_elapsed(ts, ts_torque_check_last); - if (ts_elapsed > limits.max_rt_interval) { - rt_torque_last = desired_torque; - ts_torque_check_last = ts; - } - } - - // no torque if controls is not allowed - if (!controls_allowed && (desired_torque != 0)) { - violation = true; - } - - // certain safety modes set their steer request bit low for one or more frame at a - // predefined max frequency to avoid steering faults in certain situations - bool steer_req_mismatch = (steer_req == 0) && (desired_torque != 0); - if (!limits.has_steer_req_tolerance) { - if (steer_req_mismatch) { - violation = true; - } - - } else { - if (steer_req_mismatch) { - if (invalid_steer_req_count == 0) { - // disallow torque cut if not enough recent matching steer_req messages - if (valid_steer_req_count < limits.min_valid_request_frames) { - violation = true; - } - - // or we've cut torque too recently in time - uint32_t ts_elapsed = get_ts_elapsed(ts, ts_steer_req_mismatch_last); - if (ts_elapsed < limits.min_valid_request_rt_interval) { - violation = true; - } - } else { - // or we're cutting more frames consecutively than allowed - if (invalid_steer_req_count >= limits.max_invalid_request_frames) { - violation = true; - } - } - - valid_steer_req_count = 0; - ts_steer_req_mismatch_last = ts; - invalid_steer_req_count = MIN(invalid_steer_req_count + 1, limits.max_invalid_request_frames); - } else { - valid_steer_req_count = MIN(valid_steer_req_count + 1, limits.min_valid_request_frames); - invalid_steer_req_count = 0; - } - } - - // reset to 0 if either controls is not allowed or there's a violation - if (violation || !controls_allowed) { - valid_steer_req_count = 0; - invalid_steer_req_count = 0; - desired_torque_last = 0; - rt_torque_last = 0; - ts_torque_check_last = ts; - ts_steer_req_mismatch_last = ts; - } - - return violation; -} - -// Safety checks for angle-based steering commands -bool steer_angle_cmd_checks(int desired_angle, bool steer_control_enabled, const AngleSteeringLimits limits) { - bool violation = false; - - if (controls_allowed && steer_control_enabled) { - // convert floating point angle rate limits to integers in the scale of the desired angle on CAN, - // add 1 to not false trigger the violation. also fudge the speed by 1 m/s so rate limits are - // always slightly above openpilot's in case we read an updated speed in between angle commands - // TODO: this speed fudge can be much lower, look at data to determine the lowest reasonable offset - const float fudged_speed = (vehicle_speed.min / VEHICLE_SPEED_FACTOR) - 1.; - int delta_angle_up = (interpolate(limits.angle_rate_up_lookup, fudged_speed) * limits.angle_deg_to_can) + 1.; - int delta_angle_down = (interpolate(limits.angle_rate_down_lookup, fudged_speed) * limits.angle_deg_to_can) + 1.; - - // allow down limits at zero since small floats from openpilot will be rounded to 0 - // TODO: openpilot should be cognizant of this and not send small floats - int highest_desired_angle = desired_angle_last + ((desired_angle_last > 0) ? delta_angle_up : delta_angle_down); - int lowest_desired_angle = desired_angle_last - ((desired_angle_last >= 0) ? delta_angle_down : delta_angle_up); - - // check that commanded angle value isn't too far from measured, used to limit torque for some safety modes - // ensure we start moving in direction of meas while respecting relaxed rate limits if error is exceeded - if (limits.enforce_angle_error && ((vehicle_speed.values[0] / VEHICLE_SPEED_FACTOR) > limits.angle_error_min_speed)) { - // flipped fudge to avoid false positives - const float fudged_speed_error = (vehicle_speed.max / VEHICLE_SPEED_FACTOR) + 1.; - const int delta_angle_up_relaxed = (interpolate(limits.angle_rate_up_lookup, fudged_speed_error) * limits.angle_deg_to_can) - 1.; - const int delta_angle_down_relaxed = (interpolate(limits.angle_rate_down_lookup, fudged_speed_error) * limits.angle_deg_to_can) - 1.; - - // the minimum and maximum angle allowed based on the measured angle - const int lowest_desired_angle_error = angle_meas.min - limits.max_angle_error - 1; - const int highest_desired_angle_error = angle_meas.max + limits.max_angle_error + 1; - - // the MAX is to allow the desired angle to hit the edge of the bounds and not require going under it - if (desired_angle_last > highest_desired_angle_error) { - const int delta = (desired_angle_last >= 0) ? delta_angle_down_relaxed : delta_angle_up_relaxed; - highest_desired_angle = MAX(desired_angle_last - delta, highest_desired_angle_error); - - } else if (desired_angle_last < lowest_desired_angle_error) { - const int delta = (desired_angle_last <= 0) ? delta_angle_down_relaxed : delta_angle_up_relaxed; - lowest_desired_angle = MIN(desired_angle_last + delta, lowest_desired_angle_error); - - } else { - // already inside error boundary, don't allow commanding outside it - highest_desired_angle = MIN(highest_desired_angle, highest_desired_angle_error); - lowest_desired_angle = MAX(lowest_desired_angle, lowest_desired_angle_error); - } - - // don't enforce above the max steer - // TODO: this should always be done - lowest_desired_angle = CLAMP(lowest_desired_angle, -limits.max_angle, limits.max_angle); - highest_desired_angle = CLAMP(highest_desired_angle, -limits.max_angle, limits.max_angle); - } - - // check not above ISO 11270 lateral accel assuming worst case road roll - if (limits.angle_is_curvature) { - // ISO 11270 - static const float ISO_LATERAL_ACCEL = 3.0; // m/s^2 - - // Limit to average banked road since safety doesn't have the roll - static const float EARTH_G = 9.81; - static const float AVERAGE_ROAD_ROLL = 0.06; // ~3.4 degrees, 6% superelevation - static const float MAX_LATERAL_ACCEL = ISO_LATERAL_ACCEL - (EARTH_G * AVERAGE_ROAD_ROLL); // ~2.4 m/s^2 - - // Allow small tolerance by using minimum speed and rounding curvature up - const float speed_lower = MAX(vehicle_speed.min / VEHICLE_SPEED_FACTOR, 1.0); - const float speed_upper = MAX(vehicle_speed.max / VEHICLE_SPEED_FACTOR, 1.0); - const int max_curvature_upper = (MAX_LATERAL_ACCEL / (speed_lower * speed_lower) * limits.angle_deg_to_can) + 1.; - const int max_curvature_lower = (MAX_LATERAL_ACCEL / (speed_upper * speed_upper) * limits.angle_deg_to_can) - 1.; - - // ensure that the curvature error doesn't try to enforce above this limit - if (desired_angle_last > 0) { - lowest_desired_angle = CLAMP(lowest_desired_angle, -max_curvature_lower, max_curvature_lower); - highest_desired_angle = CLAMP(highest_desired_angle, -max_curvature_upper, max_curvature_upper); - } else { - lowest_desired_angle = CLAMP(lowest_desired_angle, -max_curvature_upper, max_curvature_upper); - highest_desired_angle = CLAMP(highest_desired_angle, -max_curvature_lower, max_curvature_lower); - } - } - - // check for violation; - violation |= max_limit_check(desired_angle, highest_desired_angle, lowest_desired_angle); - } - desired_angle_last = desired_angle; - - // Angle should either be 0 or same as current angle while not steering - if (!steer_control_enabled) { - const int max_inactive_angle = CLAMP(angle_meas.max, -limits.max_angle, limits.max_angle) + 1; - const int min_inactive_angle = CLAMP(angle_meas.min, -limits.max_angle, limits.max_angle) - 1; - violation |= (limits.inactive_angle_is_zero ? (desired_angle != 0) : - max_limit_check(desired_angle, max_inactive_angle, min_inactive_angle)); - } - - // No angle control allowed when controls are not allowed - violation |= !controls_allowed && steer_control_enabled; - - return violation; -} - -void pcm_cruise_check(bool cruise_engaged) { - // Enter controls on rising edge of stock ACC, exit controls if stock ACC disengages - if (!cruise_engaged) { - controls_allowed = false; - } - if (cruise_engaged && !cruise_engaged_prev) { - controls_allowed = true; - } - cruise_engaged_prev = cruise_engaged; -} diff --git a/opendbc/safety/safety/safety_body.h b/opendbc/safety/safety/safety_body.h deleted file mode 100644 index 79d4b475ac7..00000000000 --- a/opendbc/safety/safety/safety_body.h +++ /dev/null @@ -1,50 +0,0 @@ -#pragma once - -#include "safety_declarations.h" - -static void body_rx_hook(const CANPacket_t *to_push) { - // body is never at standstill - vehicle_moving = true; - - if (GET_ADDR(to_push) == 0x201U) { - controls_allowed = true; - } -} - -static bool body_tx_hook(const CANPacket_t *to_send) { - bool tx = true; - int addr = GET_ADDR(to_send); - int len = GET_LEN(to_send); - - if (!controls_allowed && (addr != 0x1)) { - tx = false; - } - - // Allow going into CAN flashing mode for base & knee even if controls are not allowed - bool flash_msg = ((addr == 0x250) || (addr == 0x350)) && (len == 8); - if (!controls_allowed && (GET_BYTES(to_send, 0, 4) == 0xdeadfaceU) && (GET_BYTES(to_send, 4, 4) == 0x0ab00b1eU) && flash_msg) { - tx = true; - } - - return tx; -} - -static safety_config body_init(uint16_t param) { - static RxCheck body_rx_checks[] = { - {.msg = {{0x201, 0, 8, .ignore_checksum = true, .ignore_counter = true, .frequency = 100U}, { 0 }, { 0 }}}, - }; - - static const CanMsg BODY_TX_MSGS[] = {{0x250, 0, 8}, {0x250, 0, 6}, {0x251, 0, 5}, // body - {0x350, 0, 8}, {0x350, 0, 6}, {0x351, 0, 5}, // knee - {0x1, 0, 8}}; // CAN flasher - - UNUSED(param); - return BUILD_SAFETY_CFG(body_rx_checks, BODY_TX_MSGS); -} - -const safety_hooks body_hooks = { - .init = body_init, - .rx = body_rx_hook, - .tx = body_tx_hook, - .fwd = default_fwd_hook, -}; diff --git a/opendbc/safety/safety/safety_chrysler.h b/opendbc/safety/safety/safety_chrysler.h deleted file mode 100644 index 985a8c10842..00000000000 --- a/opendbc/safety/safety/safety_chrysler.h +++ /dev/null @@ -1,304 +0,0 @@ -#pragma once - -#include "safety_declarations.h" - -typedef struct { - const int EPS_2; - const int ESP_1; - const int ESP_8; - const int ECM_5; - const int DAS_3; - const int DAS_6; - const int LKAS_COMMAND; - const int CRUISE_BUTTONS; -} ChryslerAddrs; - -typedef enum { - CHRYSLER_RAM_DT, - CHRYSLER_RAM_HD, - CHRYSLER_PACIFICA, // plus Jeep -} ChryslerPlatform; -static ChryslerPlatform chrysler_platform; -static const ChryslerAddrs *chrysler_addrs; - -static uint32_t chrysler_get_checksum(const CANPacket_t *to_push) { - int checksum_byte = GET_LEN(to_push) - 1U; - return (uint8_t)(GET_BYTE(to_push, checksum_byte)); -} - -static uint32_t chrysler_compute_checksum(const CANPacket_t *to_push) { - // TODO: clean this up - // http://illmatics.com/Remote%20Car%20Hacking.pdf - uint8_t checksum = 0xFFU; - int len = GET_LEN(to_push); - for (int j = 0; j < (len - 1); j++) { - uint8_t shift = 0x80U; - uint8_t curr = (uint8_t)GET_BYTE(to_push, j); - for (int i=0; i<8; i++) { - uint8_t bit_sum = curr & shift; - uint8_t temp_chk = checksum & 0x80U; - if (bit_sum != 0U) { - bit_sum = 0x1C; - if (temp_chk != 0U) { - bit_sum = 1; - } - checksum = checksum << 1; - temp_chk = checksum | 1U; - bit_sum ^= temp_chk; - } else { - if (temp_chk != 0U) { - bit_sum = 0x1D; - } - checksum = checksum << 1; - bit_sum ^= checksum; - } - checksum = bit_sum; - shift = shift >> 1; - } - } - return (uint8_t)(~checksum); -} - -static uint8_t chrysler_get_counter(const CANPacket_t *to_push) { - return (uint8_t)(GET_BYTE(to_push, 6) >> 4); -} - -static void chrysler_rx_hook(const CANPacket_t *to_push) { - const int bus = GET_BUS(to_push); - const int addr = GET_ADDR(to_push); - - // Measured EPS torque - if ((bus == 0) && (addr == chrysler_addrs->EPS_2)) { - int torque_meas_new = ((GET_BYTE(to_push, 4) & 0x7U) << 8) + GET_BYTE(to_push, 5) - 1024U; - update_sample(&torque_meas, torque_meas_new); - } - - // enter controls on rising edge of ACC, exit controls on ACC off - const int das_3_bus = (chrysler_platform == CHRYSLER_PACIFICA) ? 0 : 2; - if ((bus == das_3_bus) && (addr == chrysler_addrs->DAS_3)) { - bool cruise_engaged = GET_BIT(to_push, 21U); - pcm_cruise_check(cruise_engaged); - } - - // TODO: use the same message for both - // update vehicle moving - if ((chrysler_platform != CHRYSLER_PACIFICA) && (bus == 0) && (addr == chrysler_addrs->ESP_8)) { - vehicle_moving = ((GET_BYTE(to_push, 4) << 8) + GET_BYTE(to_push, 5)) != 0U; - } - if ((chrysler_platform == CHRYSLER_PACIFICA) && (bus == 0) && (addr == 514)) { - int speed_l = (GET_BYTE(to_push, 0) << 4) + (GET_BYTE(to_push, 1) >> 4); - int speed_r = (GET_BYTE(to_push, 2) << 4) + (GET_BYTE(to_push, 3) >> 4); - vehicle_moving = (speed_l != 0) || (speed_r != 0); - } - - // exit controls on rising edge of gas press - if ((bus == 0) && (addr == chrysler_addrs->ECM_5)) { - gas_pressed = GET_BYTE(to_push, 0U) != 0U; - } - - // exit controls on rising edge of brake press - if ((bus == 0) && (addr == chrysler_addrs->ESP_1)) { - brake_pressed = ((GET_BYTE(to_push, 0U) & 0xFU) >> 2U) == 1U; - } - - generic_rx_checks((bus == 0) && (addr == chrysler_addrs->LKAS_COMMAND)); -} - -static bool chrysler_tx_hook(const CANPacket_t *to_send) { - const TorqueSteeringLimits CHRYSLER_STEERING_LIMITS = { - .max_steer = 261, - .max_rt_delta = 112, - .max_rt_interval = 250000, - .max_rate_up = 3, - .max_rate_down = 3, - .max_torque_error = 80, - .type = TorqueMotorLimited, - }; - - const TorqueSteeringLimits CHRYSLER_RAM_DT_STEERING_LIMITS = { - .max_steer = 350, - .max_rt_delta = 112, - .max_rt_interval = 250000, - .max_rate_up = 6, - .max_rate_down = 6, - .max_torque_error = 80, - .type = TorqueMotorLimited, - }; - - const TorqueSteeringLimits CHRYSLER_RAM_HD_STEERING_LIMITS = { - .max_steer = 361, - .max_rt_delta = 182, - .max_rt_interval = 250000, - .max_rate_up = 14, - .max_rate_down = 14, - .max_torque_error = 80, - .type = TorqueMotorLimited, - }; - - bool tx = true; - int addr = GET_ADDR(to_send); - - // STEERING - if (addr == chrysler_addrs->LKAS_COMMAND) { - int start_byte = (chrysler_platform == CHRYSLER_PACIFICA) ? 0 : 1; - int desired_torque = ((GET_BYTE(to_send, start_byte) & 0x7U) << 8) | GET_BYTE(to_send, start_byte + 1); - desired_torque -= 1024; - - const TorqueSteeringLimits limits = (chrysler_platform == CHRYSLER_PACIFICA) ? CHRYSLER_STEERING_LIMITS : - (chrysler_platform == CHRYSLER_RAM_DT) ? CHRYSLER_RAM_DT_STEERING_LIMITS : CHRYSLER_RAM_HD_STEERING_LIMITS; - - bool steer_req = (chrysler_platform == CHRYSLER_PACIFICA) ? GET_BIT(to_send, 4U) : (GET_BYTE(to_send, 3) & 0x7U) == 2U; - if (steer_torque_cmd_checks(desired_torque, steer_req, limits)) { - tx = false; - } - } - - // FORCE CANCEL: only the cancel button press is allowed - if (addr == chrysler_addrs->CRUISE_BUTTONS) { - const bool is_cancel = GET_BYTE(to_send, 0) == 1U; - const bool is_resume = GET_BYTE(to_send, 0) == 0x10U; - const bool allowed = is_cancel || (is_resume && controls_allowed); - if (!allowed) { - tx = false; - } - } - - return tx; -} - -static int chrysler_fwd_hook(int bus_num, int addr) { - int bus_fwd = -1; - - // forward to camera - if (bus_num == 0) { - bus_fwd = 2; - } - - // forward all messages from camera except LKAS messages - const bool is_lkas = ((addr == chrysler_addrs->LKAS_COMMAND) || (addr == chrysler_addrs->DAS_6)); - if ((bus_num == 2) && !is_lkas){ - bus_fwd = 0; - } - - return bus_fwd; -} - -static safety_config chrysler_init(uint16_t param) { - - const uint32_t CHRYSLER_PARAM_RAM_DT = 1U; // set for Ram DT platform - - // CAN messages for Chrysler/Jeep platforms - static const ChryslerAddrs CHRYSLER_ADDRS = { - .EPS_2 = 0x220, // EPS driver input torque - .ESP_1 = 0x140, // Brake pedal and vehicle speed - .ESP_8 = 0x11C, // Brake pedal and vehicle speed - .ECM_5 = 0x22F, // Throttle position sensor - .DAS_3 = 0x1F4, // ACC engagement states from DASM - .DAS_6 = 0x2A6, // LKAS HUD and auto headlight control from DASM - .LKAS_COMMAND = 0x292, // LKAS controls from DASM - .CRUISE_BUTTONS = 0x23B, // Cruise control buttons - }; - - // CAN messages for the 5th gen RAM DT platform - static const ChryslerAddrs CHRYSLER_RAM_DT_ADDRS = { - .EPS_2 = 0x31, // EPS driver input torque - .ESP_1 = 0x83, // Brake pedal and vehicle speed - .ESP_8 = 0x79, // Brake pedal and vehicle speed - .ECM_5 = 0x9D, // Throttle position sensor - .DAS_3 = 0x99, // ACC engagement states from DASM - .DAS_6 = 0xFA, // LKAS HUD and auto headlight control from DASM - .LKAS_COMMAND = 0xA6, // LKAS controls from DASM - .CRUISE_BUTTONS = 0xB1, // Cruise control buttons - }; - - static RxCheck chrysler_ram_dt_rx_checks[] = { - {.msg = {{CHRYSLER_RAM_DT_ADDRS.EPS_2, 0, 8, .max_counter = 15U, .frequency = 100U}, { 0 }, { 0 }}}, - {.msg = {{CHRYSLER_RAM_DT_ADDRS.ESP_1, 0, 8, .max_counter = 15U, .frequency = 50U}, { 0 }, { 0 }}}, - {.msg = {{CHRYSLER_RAM_DT_ADDRS.ESP_8, 0, 8, .max_counter = 15U, .frequency = 50U}, { 0 }, { 0 }}}, - {.msg = {{CHRYSLER_RAM_DT_ADDRS.ECM_5, 0, 8, .max_counter = 15U, .frequency = 50U}, { 0 }, { 0 }}}, - {.msg = {{CHRYSLER_RAM_DT_ADDRS.DAS_3, 2, 8, .max_counter = 15U, .frequency = 50U}, { 0 }, { 0 }}}, - }; - - static RxCheck chrysler_rx_checks[] = { - {.msg = {{CHRYSLER_ADDRS.EPS_2, 0, 8, .max_counter = 15U, .frequency = 100U}, { 0 }, { 0 }}}, - {.msg = {{CHRYSLER_ADDRS.ESP_1, 0, 8, .max_counter = 15U, .frequency = 50U}, { 0 }, { 0 }}}, - //{.msg = {{ESP_8, 0, 8, .max_counter = 15U, .frequency = 50U}}}, - {.msg = {{514, 0, 8, .ignore_checksum = true, .ignore_counter = true, .frequency = 100U}, { 0 }, { 0 }}}, - {.msg = {{CHRYSLER_ADDRS.ECM_5, 0, 8, .max_counter = 15U, .frequency = 50U}, { 0 }, { 0 }}}, - {.msg = {{CHRYSLER_ADDRS.DAS_3, 0, 8, .max_counter = 15U, .frequency = 50U}, { 0 }, { 0 }}}, - }; - - static const CanMsg CHRYSLER_TX_MSGS[] = { - {CHRYSLER_ADDRS.CRUISE_BUTTONS, 0, 3}, - {CHRYSLER_ADDRS.LKAS_COMMAND, 0, 6}, - {CHRYSLER_ADDRS.DAS_6, 0, 8}, - }; - - static const CanMsg CHRYSLER_RAM_DT_TX_MSGS[] = { - {CHRYSLER_RAM_DT_ADDRS.CRUISE_BUTTONS, 2, 3}, - {CHRYSLER_RAM_DT_ADDRS.LKAS_COMMAND, 0, 8}, - {CHRYSLER_RAM_DT_ADDRS.DAS_6, 0, 8}, - }; - -#ifdef ALLOW_DEBUG - // CAN messages for the 5th gen RAM HD platform - static const ChryslerAddrs CHRYSLER_RAM_HD_ADDRS = { - .EPS_2 = 0x220, // EPS driver input torque - .ESP_1 = 0x140, // Brake pedal and vehicle speed - .ESP_8 = 0x11C, // Brake pedal and vehicle speed - .ECM_5 = 0x22F, // Throttle position sensor - .DAS_3 = 0x1F4, // ACC engagement states from DASM - .DAS_6 = 0x275, // LKAS HUD and auto headlight control from DASM - .LKAS_COMMAND = 0x276, // LKAS controls from DASM - .CRUISE_BUTTONS = 0x23A, // Cruise control buttons - }; - - static RxCheck chrysler_ram_hd_rx_checks[] = { - {.msg = {{CHRYSLER_RAM_HD_ADDRS.EPS_2, 0, 8, .max_counter = 15U, .frequency = 100U}, { 0 }, { 0 }}}, - {.msg = {{CHRYSLER_RAM_HD_ADDRS.ESP_1, 0, 8, .max_counter = 15U, .frequency = 50U}, { 0 }, { 0 }}}, - {.msg = {{CHRYSLER_RAM_HD_ADDRS.ESP_8, 0, 8, .max_counter = 15U, .frequency = 50U}, { 0 }, { 0 }}}, - {.msg = {{CHRYSLER_RAM_HD_ADDRS.ECM_5, 0, 8, .max_counter = 15U, .frequency = 50U}, { 0 }, { 0 }}}, - {.msg = {{CHRYSLER_RAM_HD_ADDRS.DAS_3, 2, 8, .max_counter = 15U, .frequency = 50U}, { 0 }, { 0 }}}, - }; - - static const CanMsg CHRYSLER_RAM_HD_TX_MSGS[] = { - {CHRYSLER_RAM_HD_ADDRS.CRUISE_BUTTONS, 2, 3}, - {CHRYSLER_RAM_HD_ADDRS.LKAS_COMMAND, 0, 8}, - {CHRYSLER_RAM_HD_ADDRS.DAS_6, 0, 8}, - }; - - const uint32_t CHRYSLER_PARAM_RAM_HD = 2U; // set for Ram HD platform - bool enable_ram_hd = GET_FLAG(param, CHRYSLER_PARAM_RAM_HD); -#endif - - safety_config ret; - - bool enable_ram_dt = GET_FLAG(param, CHRYSLER_PARAM_RAM_DT); - - if (enable_ram_dt) { - chrysler_platform = CHRYSLER_RAM_DT; - chrysler_addrs = &CHRYSLER_RAM_DT_ADDRS; - ret = BUILD_SAFETY_CFG(chrysler_ram_dt_rx_checks, CHRYSLER_RAM_DT_TX_MSGS); -#ifdef ALLOW_DEBUG - } else if (enable_ram_hd) { - chrysler_platform = CHRYSLER_RAM_HD; - chrysler_addrs = &CHRYSLER_RAM_HD_ADDRS; - ret = BUILD_SAFETY_CFG(chrysler_ram_hd_rx_checks, CHRYSLER_RAM_HD_TX_MSGS); -#endif - } else { - chrysler_platform = CHRYSLER_PACIFICA; - chrysler_addrs = &CHRYSLER_ADDRS; - ret = BUILD_SAFETY_CFG(chrysler_rx_checks, CHRYSLER_TX_MSGS); - } - return ret; -} - -const safety_hooks chrysler_hooks = { - .init = chrysler_init, - .rx = chrysler_rx_hook, - .tx = chrysler_tx_hook, - .fwd = chrysler_fwd_hook, - .get_counter = chrysler_get_counter, - .get_checksum = chrysler_get_checksum, - .compute_checksum = chrysler_compute_checksum, -}; diff --git a/opendbc/safety/safety/safety_defaults.h b/opendbc/safety/safety/safety_defaults.h deleted file mode 100644 index ca7a18c6f0b..00000000000 --- a/opendbc/safety/safety/safety_defaults.h +++ /dev/null @@ -1,76 +0,0 @@ -#pragma once - -#include "safety_declarations.h" - -void default_rx_hook(const CANPacket_t *to_push) { - UNUSED(to_push); -} - -// *** no output safety mode *** - -static safety_config nooutput_init(uint16_t param) { - UNUSED(param); - return (safety_config){NULL, 0, NULL, 0}; -} - -// GCOV_EXCL_START -// Unreachable by design (doesn't define any tx msgs) -static bool nooutput_tx_hook(const CANPacket_t *to_send) { - UNUSED(to_send); - return false; -} -// GCOV_EXCL_STOP - -static int default_fwd_hook(int bus_num, int addr) { - UNUSED(bus_num); - UNUSED(addr); - return -1; -} - -const safety_hooks nooutput_hooks = { - .init = nooutput_init, - .rx = default_rx_hook, - .tx = nooutput_tx_hook, - .fwd = default_fwd_hook, -}; - -// *** all output safety mode *** - -// Enables passthrough mode where relay is open and bus 0 gets forwarded to bus 2 and vice versa -static bool alloutput_passthrough = false; - -static safety_config alloutput_init(uint16_t param) { - // Enables passthrough mode where relay is open and bus 0 gets forwarded to bus 2 and vice versa - const uint16_t ALLOUTPUT_PARAM_PASSTHROUGH = 1; - controls_allowed = true; - alloutput_passthrough = GET_FLAG(param, ALLOUTPUT_PARAM_PASSTHROUGH); - return (safety_config){NULL, 0, NULL, 0}; -} - -static bool alloutput_tx_hook(const CANPacket_t *to_send) { - UNUSED(to_send); - return true; -} - -static int alloutput_fwd_hook(int bus_num, int addr) { - int bus_fwd = -1; - UNUSED(addr); - - if (alloutput_passthrough) { - if (bus_num == 0) { - bus_fwd = 2; - } - if (bus_num == 2) { - bus_fwd = 0; - } - } - - return bus_fwd; -} - -const safety_hooks alloutput_hooks = { - .init = alloutput_init, - .rx = default_rx_hook, - .tx = alloutput_tx_hook, - .fwd = alloutput_fwd_hook, -}; diff --git a/opendbc/safety/safety/safety_elm327.h b/opendbc/safety/safety/safety_elm327.h deleted file mode 100644 index 83efd826b92..00000000000 --- a/opendbc/safety/safety/safety_elm327.h +++ /dev/null @@ -1,42 +0,0 @@ -#pragma once - -#include "safety_declarations.h" -#include "safety_defaults.h" - -static bool elm327_tx_hook(const CANPacket_t *to_send) { - const int GM_CAMERA_DIAG_ADDR = 0x24B; - - bool tx = true; - int addr = GET_ADDR(to_send); - int len = GET_LEN(to_send); - - // All ISO 15765-4 messages must be 8 bytes long - if (len != 8) { - tx = false; - } - - // Check valid 29 bit send addresses for ISO 15765-4 - // Check valid 11 bit send addresses for ISO 15765-4 - if ((addr != 0x18DB33F1) && ((addr & 0x1FFF00FF) != 0x18DA00F1) && - ((addr & 0x1FFFFF00) != 0x600) && ((addr & 0x1FFFFF00) != 0x700) && - (addr != GM_CAMERA_DIAG_ADDR)) { - tx = false; - } - - // GM camera uses non-standard diagnostic address, this has no control message address collisions - if ((addr == GM_CAMERA_DIAG_ADDR) && (len == 8)) { - // Only allow known frame types for ISO 15765-2 - if ((GET_BYTE(to_send, 0) & 0xF0U) > 0x30U) { - tx = false; - } - } - return tx; -} - -// If current_board->has_obd and safety_param == 0, bus 1 is multiplexed to the OBD-II port -const safety_hooks elm327_hooks = { - .init = nooutput_init, - .rx = default_rx_hook, - .tx = elm327_tx_hook, - .fwd = default_fwd_hook, -}; diff --git a/opendbc/safety/safety/safety_ford.h b/opendbc/safety/safety/safety_ford.h deleted file mode 100644 index 897a90a41e2..00000000000 --- a/opendbc/safety/safety/safety_ford.h +++ /dev/null @@ -1,434 +0,0 @@ -#pragma once - -#include "safety_declarations.h" - -// Safety-relevant CAN messages for Ford vehicles. -#define FORD_EngBrakeData 0x165 // RX from PCM, for driver brake pedal and cruise state -#define FORD_EngVehicleSpThrottle 0x204 // RX from PCM, for driver throttle input -#define FORD_DesiredTorqBrk 0x213 // RX from ABS, for standstill state -#define FORD_BrakeSysFeatures 0x415 // RX from ABS, for vehicle speed -#define FORD_EngVehicleSpThrottle2 0x202 // RX from PCM, for second vehicle speed -#define FORD_Yaw_Data_FD1 0x91 // RX from RCM, for yaw rate -#define FORD_Steering_Data_FD1 0x083 // TX by OP, various driver switches and LKAS/CC buttons -#define FORD_ACCDATA 0x186 // TX by OP, ACC controls -#define FORD_ACCDATA_3 0x18A // TX by OP, ACC/TJA user interface -#define FORD_Lane_Assist_Data1 0x3CA // TX by OP, Lane Keep Assist -#define FORD_LateralMotionControl 0x3D3 // TX by OP, Lateral Control message -#define FORD_LateralMotionControl2 0x3D6 // TX by OP, alternate Lateral Control message -#define FORD_IPMA_Data 0x3D8 // TX by OP, IPMA and LKAS user interface - -// CAN bus numbers. -#define FORD_MAIN_BUS 0U -#define FORD_CAM_BUS 2U - -static uint8_t ford_get_counter(const CANPacket_t *to_push) { - int addr = GET_ADDR(to_push); - - uint8_t cnt = 0; - if (addr == FORD_BrakeSysFeatures) { - // Signal: VehVActlBrk_No_Cnt - cnt = (GET_BYTE(to_push, 2) >> 2) & 0xFU; - } else if (addr == FORD_Yaw_Data_FD1) { - // Signal: VehRollYaw_No_Cnt - cnt = GET_BYTE(to_push, 5); - } else { - } - return cnt; -} - -static uint32_t ford_get_checksum(const CANPacket_t *to_push) { - int addr = GET_ADDR(to_push); - - uint8_t chksum = 0; - if (addr == FORD_BrakeSysFeatures) { - // Signal: VehVActlBrk_No_Cs - chksum = GET_BYTE(to_push, 3); - } else if (addr == FORD_Yaw_Data_FD1) { - // Signal: VehRollYawW_No_Cs - chksum = GET_BYTE(to_push, 4); - } else { - } - return chksum; -} - -static uint32_t ford_compute_checksum(const CANPacket_t *to_push) { - int addr = GET_ADDR(to_push); - - uint8_t chksum = 0; - if (addr == FORD_BrakeSysFeatures) { - chksum += GET_BYTE(to_push, 0) + GET_BYTE(to_push, 1); // Veh_V_ActlBrk - chksum += GET_BYTE(to_push, 2) >> 6; // VehVActlBrk_D_Qf - chksum += (GET_BYTE(to_push, 2) >> 2) & 0xFU; // VehVActlBrk_No_Cnt - chksum = 0xFFU - chksum; - } else if (addr == FORD_Yaw_Data_FD1) { - chksum += GET_BYTE(to_push, 0) + GET_BYTE(to_push, 1); // VehRol_W_Actl - chksum += GET_BYTE(to_push, 2) + GET_BYTE(to_push, 3); // VehYaw_W_Actl - chksum += GET_BYTE(to_push, 5); // VehRollYaw_No_Cnt - chksum += GET_BYTE(to_push, 6) >> 6; // VehRolWActl_D_Qf - chksum += (GET_BYTE(to_push, 6) >> 4) & 0x3U; // VehYawWActl_D_Qf - chksum = 0xFFU - chksum; - } else { - } - - return chksum; -} - -static bool ford_get_quality_flag_valid(const CANPacket_t *to_push) { - int addr = GET_ADDR(to_push); - - bool valid = false; - if (addr == FORD_BrakeSysFeatures) { - valid = (GET_BYTE(to_push, 2) >> 6) == 0x3U; // VehVActlBrk_D_Qf - } else if (addr == FORD_EngVehicleSpThrottle2) { - valid = ((GET_BYTE(to_push, 4) >> 5) & 0x3U) == 0x3U; // VehVActlEng_D_Qf - } else if (addr == FORD_Yaw_Data_FD1) { - valid = ((GET_BYTE(to_push, 6) >> 4) & 0x3U) == 0x3U; // VehYawWActl_D_Qf - } else { - } - return valid; -} - -static bool ford_longitudinal = false; - -#define FORD_INACTIVE_CURVATURE 1000U -#define FORD_INACTIVE_CURVATURE_RATE 4096U -#define FORD_INACTIVE_PATH_OFFSET 512U -#define FORD_INACTIVE_PATH_ANGLE 1000U - -#define FORD_CANFD_INACTIVE_CURVATURE_RATE 1024U - -#define FORD_MAX_SPEED_DELTA 2.0 // m/s - -static bool ford_lkas_msg_check(int addr) { - return (addr == FORD_ACCDATA_3) - || (addr == FORD_Lane_Assist_Data1) - || (addr == FORD_LateralMotionControl) - || (addr == FORD_LateralMotionControl2) - || (addr == FORD_IPMA_Data); -} - -// Curvature rate limits -#define FORD_LIMITS(limit_lateral_acceleration) { \ - .max_angle = 1000, /* 0.02 curvature */ \ - .angle_deg_to_can = 50000, /* 1 / (2e-5) rad to can */ \ - .max_angle_error = 100, /* 0.002 * FORD_STEERING_LIMITS.angle_deg_to_can */ \ - .angle_rate_up_lookup = { \ - {5., 25., 25.}, \ - {0.00045, 0.0001, 0.0001} \ - }, \ - .angle_rate_down_lookup = { \ - {5., 25., 25.}, \ - {0.00045, 0.00015, 0.00015} \ - }, \ - \ - /* no blending at low speed due to lack of torque wind-up and inaccurate current curvature */ \ - .angle_error_min_speed = 10.0, /* m/s */ \ - \ - .angle_is_curvature = (limit_lateral_acceleration), \ - .enforce_angle_error = true, \ - .inactive_angle_is_zero = true, \ -} - -static const AngleSteeringLimits FORD_STEERING_LIMITS = FORD_LIMITS(false); - -static void ford_rx_hook(const CANPacket_t *to_push) { - if (GET_BUS(to_push) == FORD_MAIN_BUS) { - int addr = GET_ADDR(to_push); - - // Update in motion state from standstill signal - if (addr == FORD_DesiredTorqBrk) { - // Signal: VehStop_D_Stat - vehicle_moving = ((GET_BYTE(to_push, 3) >> 3) & 0x3U) != 1U; - } - - // Update vehicle speed - if (addr == FORD_BrakeSysFeatures) { - // Signal: Veh_V_ActlBrk - UPDATE_VEHICLE_SPEED(((GET_BYTE(to_push, 0) << 8) | GET_BYTE(to_push, 1)) * 0.01 / 3.6); - } - - // Check vehicle speed against a second source - if (addr == FORD_EngVehicleSpThrottle2) { - // Disable controls if speeds from ABS and PCM ECUs are too far apart. - // Signal: Veh_V_ActlEng - float filtered_pcm_speed = ((GET_BYTE(to_push, 6) << 8) | GET_BYTE(to_push, 7)) * 0.01 / 3.6; - bool is_invalid_speed = ABS(filtered_pcm_speed - ((float)vehicle_speed.values[0] / VEHICLE_SPEED_FACTOR)) > FORD_MAX_SPEED_DELTA; - if (is_invalid_speed) { - controls_allowed = false; - } - } - - // Update vehicle yaw rate - if (addr == FORD_Yaw_Data_FD1) { - // Signal: VehYaw_W_Actl - // TODO: we should use the speed which results in the closest angle measurement to the desired angle - float ford_yaw_rate = (((GET_BYTE(to_push, 2) << 8U) | GET_BYTE(to_push, 3)) * 0.0002) - 6.5; - float current_curvature = ford_yaw_rate / MAX(vehicle_speed.values[0] / VEHICLE_SPEED_FACTOR, 0.1); - // convert current curvature into units on CAN for comparison with desired curvature - update_sample(&angle_meas, ROUND(current_curvature * FORD_STEERING_LIMITS.angle_deg_to_can)); - } - - // Update gas pedal - if (addr == FORD_EngVehicleSpThrottle) { - // Pedal position: (0.1 * val) in percent - // Signal: ApedPos_Pc_ActlArb - gas_pressed = (((GET_BYTE(to_push, 0) & 0x03U) << 8) | GET_BYTE(to_push, 1)) > 0U; - } - - // Update brake pedal and cruise state - if (addr == FORD_EngBrakeData) { - // Signal: BpedDrvAppl_D_Actl - brake_pressed = ((GET_BYTE(to_push, 0) >> 4) & 0x3U) == 2U; - - // Signal: CcStat_D_Actl - unsigned int cruise_state = GET_BYTE(to_push, 1) & 0x07U; - bool cruise_engaged = (cruise_state == 4U) || (cruise_state == 5U); - pcm_cruise_check(cruise_engaged); - } - - // If steering controls messages are received on the destination bus, it's an indication - // that the relay might be malfunctioning. - bool stock_ecu_detected = ford_lkas_msg_check(addr); - if (ford_longitudinal) { - stock_ecu_detected = stock_ecu_detected || (addr == FORD_ACCDATA); - } - generic_rx_checks(stock_ecu_detected); - } - -} - -static bool ford_tx_hook(const CANPacket_t *to_send) { - const LongitudinalLimits FORD_LONG_LIMITS = { - // acceleration cmd limits (used for brakes) - // Signal: AccBrkTot_A_Rq - .max_accel = 5641, // 1.9999 m/s^s - .min_accel = 4231, // -3.4991 m/s^2 - .inactive_accel = 5128, // -0.0008 m/s^2 - - // gas cmd limits - // Signal: AccPrpl_A_Rq & AccPrpl_A_Pred - .max_gas = 700, // 2.0 m/s^2 - .min_gas = 450, // -0.5 m/s^2 - .inactive_gas = 0, // -5.0 m/s^2 - }; - - bool tx = true; - - int addr = GET_ADDR(to_send); - - // Safety check for ACCDATA accel and brake requests - if (addr == FORD_ACCDATA) { - // Signal: AccPrpl_A_Rq - int gas = ((GET_BYTE(to_send, 6) & 0x3U) << 8) | GET_BYTE(to_send, 7); - // Signal: AccPrpl_A_Pred - int gas_pred = ((GET_BYTE(to_send, 2) & 0x3U) << 8) | GET_BYTE(to_send, 3); - // Signal: AccBrkTot_A_Rq - int accel = ((GET_BYTE(to_send, 0) & 0x1FU) << 8) | GET_BYTE(to_send, 1); - // Signal: CmbbDeny_B_Actl - bool cmbb_deny = GET_BIT(to_send, 37U); - - // Signal: AccBrkPrchg_B_Rq & AccBrkDecel_B_Rq - bool brake_actuation = GET_BIT(to_send, 54U) || GET_BIT(to_send, 55U); - - bool violation = false; - violation |= longitudinal_accel_checks(accel, FORD_LONG_LIMITS); - violation |= longitudinal_gas_checks(gas, FORD_LONG_LIMITS); - violation |= longitudinal_gas_checks(gas_pred, FORD_LONG_LIMITS); - - // Safety check for stock AEB - violation |= cmbb_deny; // do not prevent stock AEB actuation - - violation |= !get_longitudinal_allowed() && brake_actuation; - - if (violation) { - tx = false; - } - } - - // Safety check for Steering_Data_FD1 button signals - // Note: Many other signals in this message are not relevant to safety (e.g. blinkers, wiper switches, high beam) - // which we passthru in OP. - if (addr == FORD_Steering_Data_FD1) { - // Violation if resume button is pressed while controls not allowed, or - // if cancel button is pressed when cruise isn't engaged. - bool violation = false; - violation |= GET_BIT(to_send, 8U) && !cruise_engaged_prev; // Signal: CcAslButtnCnclPress (cancel) - violation |= GET_BIT(to_send, 25U) && !controls_allowed; // Signal: CcAsllButtnResPress (resume) - - if (violation) { - tx = false; - } - } - - // Safety check for Lane_Assist_Data1 action - if (addr == FORD_Lane_Assist_Data1) { - // Do not allow steering using Lane_Assist_Data1 (Lane-Departure Aid). - // This message must be sent for Lane Centering to work, and can include - // values such as the steering angle or lane curvature for debugging, - // but the action (LkaActvStats_D2_Req) must be set to zero. - unsigned int action = GET_BYTE(to_send, 0) >> 5; - if (action != 0U) { - tx = false; - } - } - - // Safety check for LateralMotionControl action - if (addr == FORD_LateralMotionControl) { - // Signal: LatCtl_D_Rq - bool steer_control_enabled = ((GET_BYTE(to_send, 4) >> 2) & 0x7U) != 0U; - unsigned int raw_curvature = (GET_BYTE(to_send, 0) << 3) | (GET_BYTE(to_send, 1) >> 5); - unsigned int raw_curvature_rate = ((GET_BYTE(to_send, 1) & 0x1FU) << 8) | GET_BYTE(to_send, 2); - unsigned int raw_path_angle = (GET_BYTE(to_send, 3) << 3) | (GET_BYTE(to_send, 4) >> 5); - unsigned int raw_path_offset = (GET_BYTE(to_send, 5) << 2) | (GET_BYTE(to_send, 6) >> 6); - - // These signals are not yet tested with the current safety limits - bool violation = (raw_curvature_rate != FORD_INACTIVE_CURVATURE_RATE) || (raw_path_angle != FORD_INACTIVE_PATH_ANGLE) || (raw_path_offset != FORD_INACTIVE_PATH_OFFSET); - - // Check angle error and steer_control_enabled - int desired_curvature = raw_curvature - FORD_INACTIVE_CURVATURE; // /FORD_STEERING_LIMITS.angle_deg_to_can to get real curvature - violation |= steer_angle_cmd_checks(desired_curvature, steer_control_enabled, FORD_STEERING_LIMITS); - - if (violation) { - tx = false; - } - } - - // Safety check for LateralMotionControl2 action - if (addr == FORD_LateralMotionControl2) { - static const AngleSteeringLimits FORD_CANFD_STEERING_LIMITS = FORD_LIMITS(true); - - // Signal: LatCtl_D2_Rq - bool steer_control_enabled = ((GET_BYTE(to_send, 0) >> 4) & 0x7U) != 0U; - unsigned int raw_curvature = (GET_BYTE(to_send, 2) << 3) | (GET_BYTE(to_send, 3) >> 5); - unsigned int raw_curvature_rate = (GET_BYTE(to_send, 6) << 3) | (GET_BYTE(to_send, 7) >> 5); - unsigned int raw_path_angle = ((GET_BYTE(to_send, 3) & 0x1FU) << 6) | (GET_BYTE(to_send, 4) >> 2); - unsigned int raw_path_offset = ((GET_BYTE(to_send, 4) & 0x3U) << 8) | GET_BYTE(to_send, 5); - - // These signals are not yet tested with the current safety limits - bool violation = (raw_curvature_rate != FORD_CANFD_INACTIVE_CURVATURE_RATE) || (raw_path_angle != FORD_INACTIVE_PATH_ANGLE) || (raw_path_offset != FORD_INACTIVE_PATH_OFFSET); - - // Check angle error and steer_control_enabled - int desired_curvature = raw_curvature - FORD_INACTIVE_CURVATURE; // /FORD_STEERING_LIMITS.angle_deg_to_can to get real curvature - violation |= steer_angle_cmd_checks(desired_curvature, steer_control_enabled, FORD_CANFD_STEERING_LIMITS); - - if (violation) { - tx = false; - } - } - - return tx; -} - -static int ford_fwd_hook(int bus_num, int addr) { - int bus_fwd = -1; - - switch (bus_num) { - case FORD_MAIN_BUS: { - // Forward all traffic from bus 0 onward - bus_fwd = FORD_CAM_BUS; - break; - } - case FORD_CAM_BUS: { - if (ford_lkas_msg_check(addr)) { - // Block stock LKAS and UI messages - bus_fwd = -1; - } else if (ford_longitudinal && (addr == FORD_ACCDATA)) { - // Block stock ACC message - bus_fwd = -1; - } else { - // Forward remaining traffic - bus_fwd = FORD_MAIN_BUS; - } - break; - } - default: { - // No other buses should be in use; fallback to do-not-forward - bus_fwd = -1; - break; - } - } - - return bus_fwd; -} - -static safety_config ford_init(uint16_t param) { - bool ford_canfd = false; - - // warning: quality flags are not yet checked in openpilot's CAN parser, - // this may be the cause of blocked messages - static RxCheck ford_rx_checks[] = { - {.msg = {{FORD_BrakeSysFeatures, 0, 8, .max_counter = 15U, .quality_flag=true, .frequency = 50U}, { 0 }, { 0 }}}, - // FORD_EngVehicleSpThrottle2 has a counter that either randomly skips or by 2, likely ECU bug - // Some hybrid models also experience a bug where this checksum mismatches for one or two frames under heavy acceleration with ACC - // It has been confirmed that the Bronco Sport's camera only disallows ACC for bad quality flags, not counters or checksums, so we match that - {.msg = {{FORD_EngVehicleSpThrottle2, 0, 8, .ignore_checksum = true, .ignore_counter = true, .quality_flag=true, .frequency = 50U}, { 0 }, { 0 }}}, - {.msg = {{FORD_Yaw_Data_FD1, 0, 8, .max_counter = 255U, .quality_flag=true, .frequency = 100U}, { 0 }, { 0 }}}, - // These messages have no counter or checksum - {.msg = {{FORD_EngBrakeData, 0, 8, .ignore_checksum = true, .ignore_counter = true, .frequency = 10U}, { 0 }, { 0 }}}, - {.msg = {{FORD_EngVehicleSpThrottle, 0, 8, .ignore_checksum = true, .ignore_counter = true, .frequency = 100U}, { 0 }, { 0 }}}, - {.msg = {{FORD_DesiredTorqBrk, 0, 8, .ignore_checksum = true, .ignore_counter = true, .frequency = 50U}, { 0 }, { 0 }}}, - }; - - #define FORD_COMMON_TX_MSGS \ - {FORD_Steering_Data_FD1, 0, 8}, \ - {FORD_Steering_Data_FD1, 2, 8}, \ - {FORD_ACCDATA_3, 0, 8}, \ - {FORD_Lane_Assist_Data1, 0, 8}, \ - {FORD_IPMA_Data, 0, 8}, \ - - static const CanMsg FORD_CANFD_LONG_TX_MSGS[] = { - FORD_COMMON_TX_MSGS - {FORD_ACCDATA, 0, 8}, - {FORD_LateralMotionControl2, 0, 8}, - }; - - static const CanMsg FORD_CANFD_STOCK_TX_MSGS[] = { - FORD_COMMON_TX_MSGS - {FORD_LateralMotionControl2, 0, 8}, - }; - - static const CanMsg FORD_STOCK_TX_MSGS[] = { - FORD_COMMON_TX_MSGS - {FORD_LateralMotionControl, 0, 8}, - }; - - static const CanMsg FORD_LONG_TX_MSGS[] = { - FORD_COMMON_TX_MSGS - {FORD_ACCDATA, 0, 8}, - {FORD_LateralMotionControl, 0, 8}, - }; - - const uint16_t FORD_PARAM_CANFD = 2; - ford_canfd = GET_FLAG(param, FORD_PARAM_CANFD); - - ford_longitudinal = false; - -#ifdef ALLOW_DEBUG - const uint16_t FORD_PARAM_LONGITUDINAL = 1; - ford_longitudinal = GET_FLAG(param, FORD_PARAM_LONGITUDINAL); -#endif - - // Longitudinal is the default for CAN, and optional for CAN FD w/ ALLOW_DEBUG - ford_longitudinal = !ford_canfd || ford_longitudinal; - - safety_config ret; - if (ford_canfd) { - ret = ford_longitudinal ? BUILD_SAFETY_CFG(ford_rx_checks, FORD_CANFD_LONG_TX_MSGS) : \ - BUILD_SAFETY_CFG(ford_rx_checks, FORD_CANFD_STOCK_TX_MSGS); - } else { - ret = ford_longitudinal ? BUILD_SAFETY_CFG(ford_rx_checks, FORD_LONG_TX_MSGS) : \ - BUILD_SAFETY_CFG(ford_rx_checks, FORD_STOCK_TX_MSGS); - } - return ret; -} - -const safety_hooks ford_hooks = { - .init = ford_init, - .rx = ford_rx_hook, - .tx = ford_tx_hook, - .fwd = ford_fwd_hook, - .get_counter = ford_get_counter, - .get_checksum = ford_get_checksum, - .compute_checksum = ford_compute_checksum, - .get_quality_flag_valid = ford_get_quality_flag_valid, -}; diff --git a/opendbc/safety/safety/safety_gm.h b/opendbc/safety/safety/safety_gm.h deleted file mode 100644 index e7126c8facd..00000000000 --- a/opendbc/safety/safety/safety_gm.h +++ /dev/null @@ -1,259 +0,0 @@ -#pragma once - -#include "safety_declarations.h" - -static const LongitudinalLimits *gm_long_limits; - -enum { - GM_BTN_UNPRESS = 1, - GM_BTN_RESUME = 2, - GM_BTN_SET = 3, - GM_BTN_CANCEL = 6, -}; - -typedef enum { - GM_ASCM, - GM_CAM -} GmHardware; -static GmHardware gm_hw = GM_ASCM; -static bool gm_cam_long = false; -static bool gm_pcm_cruise = false; - -static void gm_rx_hook(const CANPacket_t *to_push) { - - const int GM_STANDSTILL_THRSLD = 10; // 0.311kph - - - - if (GET_BUS(to_push) == 0U) { - int addr = GET_ADDR(to_push); - - if (addr == 0x184) { - int torque_driver_new = ((GET_BYTE(to_push, 6) & 0x7U) << 8) | GET_BYTE(to_push, 7); - torque_driver_new = to_signed(torque_driver_new, 11); - // update array of samples - update_sample(&torque_driver, torque_driver_new); - } - - // sample rear wheel speeds - if (addr == 0x34A) { - int left_rear_speed = (GET_BYTE(to_push, 0) << 8) | GET_BYTE(to_push, 1); - int right_rear_speed = (GET_BYTE(to_push, 2) << 8) | GET_BYTE(to_push, 3); - vehicle_moving = (left_rear_speed > GM_STANDSTILL_THRSLD) || (right_rear_speed > GM_STANDSTILL_THRSLD); - } - - // ACC steering wheel buttons (GM_CAM is tied to the PCM) - if ((addr == 0x1E1) && !gm_pcm_cruise) { - int button = (GET_BYTE(to_push, 5) & 0x70U) >> 4; - - // enter controls on falling edge of set or rising edge of resume (avoids fault) - bool set = (button != GM_BTN_SET) && (cruise_button_prev == GM_BTN_SET); - bool res = (button == GM_BTN_RESUME) && (cruise_button_prev != GM_BTN_RESUME); - if (set || res) { - controls_allowed = true; - } - - // exit controls on cancel press - if (button == GM_BTN_CANCEL) { - controls_allowed = false; - } - - cruise_button_prev = button; - } - - // Reference for brake pressed signals: - // https://github.com/commaai/openpilot/blob/master/selfdrive/car/gm/carstate.py - if ((addr == 0xBE) && (gm_hw == GM_ASCM)) { - brake_pressed = GET_BYTE(to_push, 1) >= 8U; - } - - if ((addr == 0xC9) && (gm_hw == GM_CAM)) { - brake_pressed = GET_BIT(to_push, 40U); - } - - if (addr == 0x1C4) { - gas_pressed = GET_BYTE(to_push, 5) != 0U; - - // enter controls on rising edge of ACC, exit controls when ACC off - if (gm_pcm_cruise) { - bool cruise_engaged = (GET_BYTE(to_push, 1) >> 5) != 0U; - pcm_cruise_check(cruise_engaged); - } - } - - if (addr == 0xBD) { - regen_braking = (GET_BYTE(to_push, 0) >> 4) != 0U; - } - - bool stock_ecu_detected = (addr == 0x180); // ASCMLKASteeringCmd - - // Check ASCMGasRegenCmd only if we're blocking it - if (!gm_pcm_cruise && (addr == 0x2CB)) { - stock_ecu_detected = true; - } - generic_rx_checks(stock_ecu_detected); - } -} - -static bool gm_tx_hook(const CANPacket_t *to_send) { - const TorqueSteeringLimits GM_STEERING_LIMITS = { - .max_steer = 300, - .max_rate_up = 10, - .max_rate_down = 15, - .driver_torque_allowance = 65, - .driver_torque_multiplier = 4, - .max_rt_delta = 128, - .max_rt_interval = 250000, - .type = TorqueDriverLimited, - }; - - bool tx = true; - int addr = GET_ADDR(to_send); - - // BRAKE: safety check - if (addr == 0x315) { - int brake = ((GET_BYTE(to_send, 0) & 0xFU) << 8) + GET_BYTE(to_send, 1); - brake = (0x1000 - brake) & 0xFFF; - if (longitudinal_brake_checks(brake, *gm_long_limits)) { - tx = false; - } - } - - // LKA STEER: safety check - if (addr == 0x180) { - int desired_torque = ((GET_BYTE(to_send, 0) & 0x7U) << 8) + GET_BYTE(to_send, 1); - desired_torque = to_signed(desired_torque, 11); - - bool steer_req = GET_BIT(to_send, 3U); - - if (steer_torque_cmd_checks(desired_torque, steer_req, GM_STEERING_LIMITS)) { - tx = false; - } - } - - // GAS/REGEN: safety check - if (addr == 0x2CB) { - bool apply = GET_BIT(to_send, 0U); - int gas_regen = ((GET_BYTE(to_send, 2) & 0x7FU) << 5) + ((GET_BYTE(to_send, 3) & 0xF8U) >> 3); - - bool violation = false; - // Allow apply bit in pre-enabled and overriding states - violation |= !controls_allowed && apply; - violation |= longitudinal_gas_checks(gas_regen, *gm_long_limits); - - if (violation) { - tx = false; - } - } - - // BUTTONS: used for resume spamming and cruise cancellation with stock longitudinal - if ((addr == 0x1E1) && gm_pcm_cruise) { - int button = (GET_BYTE(to_send, 5) >> 4) & 0x7U; - - bool allowed_cancel = (button == 6) && cruise_engaged_prev; - if (!allowed_cancel) { - tx = false; - } - } - - return tx; -} - -static int gm_fwd_hook(int bus_num, int addr) { - int bus_fwd = -1; - - if (gm_hw == GM_CAM) { - if (bus_num == 0) { - // block PSCMStatus; forwarded through openpilot to hide an alert from the camera - bool is_pscm_msg = (addr == 0x184); - if (!is_pscm_msg) { - bus_fwd = 2; - } - } - - if (bus_num == 2) { - // block lkas message and acc messages if gm_cam_long, forward all others - bool is_lkas_msg = (addr == 0x180); - bool is_acc_msg = (addr == 0x315) || (addr == 0x2CB) || (addr == 0x370); - bool block_msg = is_lkas_msg || (is_acc_msg && gm_cam_long); - if (!block_msg) { - bus_fwd = 0; - } - } - } - - return bus_fwd; -} - -static safety_config gm_init(uint16_t param) { - const uint16_t GM_PARAM_HW_CAM = 1; - - static const LongitudinalLimits GM_ASCM_LONG_LIMITS = { - .max_gas = 3072, - .min_gas = 1404, - .inactive_gas = 1404, - .max_brake = 400, - }; - - static const CanMsg GM_ASCM_TX_MSGS[] = {{0x180, 0, 4}, {0x409, 0, 7}, {0x40A, 0, 7}, {0x2CB, 0, 8}, {0x370, 0, 6}, // pt bus - {0xA1, 1, 7}, {0x306, 1, 8}, {0x308, 1, 7}, {0x310, 1, 2}, // obs bus - {0x315, 2, 5}}; // ch bus - - - static const LongitudinalLimits GM_CAM_LONG_LIMITS = { - .max_gas = 3400, - .min_gas = 1514, - .inactive_gas = 1554, - .max_brake = 400, - }; - - static const CanMsg GM_CAM_LONG_TX_MSGS[] = {{0x180, 0, 4}, {0x315, 0, 5}, {0x2CB, 0, 8}, {0x370, 0, 6}, // pt bus - {0x184, 2, 8}}; // camera bus - - - // TODO: do checksum and counter checks. Add correct timestep, 0.1s for now. - static RxCheck gm_rx_checks[] = { - {.msg = {{0x184, 0, 8, .ignore_checksum = true, .ignore_counter = true, .frequency = 10U}, { 0 }, { 0 }}}, - {.msg = {{0x34A, 0, 5, .ignore_checksum = true, .ignore_counter = true, .frequency = 10U}, { 0 }, { 0 }}}, - {.msg = {{0x1E1, 0, 7, .ignore_checksum = true, .ignore_counter = true, .frequency = 10U}, { 0 }, { 0 }}}, - {.msg = {{0xBE, 0, 6, .ignore_checksum = true, .ignore_counter = true, .frequency = 10U}, // Volt, Silverado, Acadia Denali - {0xBE, 0, 7, .ignore_checksum = true, .ignore_counter = true, .frequency = 10U}, // Bolt EUV - {0xBE, 0, 8, .ignore_checksum = true, .ignore_counter = true, .frequency = 10U}}}, // Escalade - {.msg = {{0x1C4, 0, 8, .ignore_checksum = true, .ignore_counter = true, .frequency = 10U}, { 0 }, { 0 }}}, - {.msg = {{0xC9, 0, 8, .ignore_checksum = true, .ignore_counter = true, .frequency = 10U}, { 0 }, { 0 }}}, - }; - - static const CanMsg GM_CAM_TX_MSGS[] = {{0x180, 0, 4}, // pt bus - {0x1E1, 2, 7}, {0x184, 2, 8}}; // camera bus - - gm_hw = GET_FLAG(param, GM_PARAM_HW_CAM) ? GM_CAM : GM_ASCM; - - if (gm_hw == GM_ASCM) { - gm_long_limits = &GM_ASCM_LONG_LIMITS; - } else if (gm_hw == GM_CAM) { - gm_long_limits = &GM_CAM_LONG_LIMITS; - } else { - } - -#ifdef ALLOW_DEBUG - const uint16_t GM_PARAM_HW_CAM_LONG = 2; - gm_cam_long = GET_FLAG(param, GM_PARAM_HW_CAM_LONG); -#endif - gm_pcm_cruise = (gm_hw == GM_CAM) && !gm_cam_long; - - safety_config ret = BUILD_SAFETY_CFG(gm_rx_checks, GM_ASCM_TX_MSGS); - if (gm_hw == GM_CAM) { - // FIXME: cppcheck thinks that gm_cam_long is always false. This is not true - // if ALLOW_DEBUG is defined but cppcheck is run without ALLOW_DEBUG - // cppcheck-suppress knownConditionTrueFalse - ret = gm_cam_long ? BUILD_SAFETY_CFG(gm_rx_checks, GM_CAM_LONG_TX_MSGS) : BUILD_SAFETY_CFG(gm_rx_checks, GM_CAM_TX_MSGS); - } - return ret; -} - -const safety_hooks gm_hooks = { - .init = gm_init, - .rx = gm_rx_hook, - .tx = gm_tx_hook, - .fwd = gm_fwd_hook, -}; diff --git a/opendbc/safety/safety/safety_honda.h b/opendbc/safety/safety/safety_honda.h deleted file mode 100644 index 034672d853f..00000000000 --- a/opendbc/safety/safety/safety_honda.h +++ /dev/null @@ -1,461 +0,0 @@ -#pragma once - -#include "safety_declarations.h" - -// All common address checks except SCM_BUTTONS which isn't on one Nidec safety configuration -#define HONDA_COMMON_NO_SCM_FEEDBACK_RX_CHECKS(pt_bus) \ - {.msg = {{0x1A6, (pt_bus), 8, .max_counter = 3U, .frequency = 25U}, /* SCM_BUTTONS */ \ - {0x296, (pt_bus), 4, .max_counter = 3U, .frequency = 25U}, { 0 }}}, \ - {.msg = {{0x158, (pt_bus), 8, .max_counter = 3U, .frequency = 100U}, { 0 }, { 0 }}}, /* ENGINE_DATA */ \ - {.msg = {{0x17C, (pt_bus), 8, .max_counter = 3U, .frequency = 100U}, { 0 }, { 0 }}}, /* POWERTRAIN_DATA */ \ - -#define HONDA_COMMON_RX_CHECKS(pt_bus) \ - HONDA_COMMON_NO_SCM_FEEDBACK_RX_CHECKS(pt_bus) \ - {.msg = {{0x326, (pt_bus), 8, .max_counter = 3U, .frequency = 10U}, { 0 }, { 0 }}}, /* SCM_FEEDBACK */ \ - -// Alternate brake message is used on some Honda Bosch, and Honda Bosch radarless (where PT bus is 0) -#define HONDA_ALT_BRAKE_ADDR_CHECK(pt_bus) \ - {.msg = {{0x1BE, (pt_bus), 3, .max_counter = 3U, .frequency = 50U}, { 0 }, { 0 }}}, /* BRAKE_MODULE */ \ - - -// Nidec and bosch radarless has the powertrain bus on bus 0 -static RxCheck honda_common_rx_checks[] = { - HONDA_COMMON_RX_CHECKS(0) -}; - -enum { - HONDA_BTN_NONE = 0, - HONDA_BTN_MAIN = 1, - HONDA_BTN_CANCEL = 2, - HONDA_BTN_SET = 3, - HONDA_BTN_RESUME = 4, -}; - -static int honda_brake = 0; -static bool honda_brake_switch_prev = false; -static bool honda_alt_brake_msg = false; -static bool honda_fwd_brake = false; -static bool honda_bosch_long = false; -static bool honda_bosch_radarless = false; -typedef enum {HONDA_NIDEC, HONDA_BOSCH} HondaHw; -static HondaHw honda_hw = HONDA_NIDEC; - - -static int honda_get_pt_bus(void) { - return ((honda_hw == HONDA_BOSCH) && !honda_bosch_radarless) ? 1 : 0; -} - -static uint32_t honda_get_checksum(const CANPacket_t *to_push) { - int checksum_byte = GET_LEN(to_push) - 1U; - return (uint8_t)(GET_BYTE(to_push, checksum_byte)) & 0xFU; -} - -static uint32_t honda_compute_checksum(const CANPacket_t *to_push) { - int len = GET_LEN(to_push); - uint8_t checksum = 0U; - unsigned int addr = GET_ADDR(to_push); - while (addr > 0U) { - checksum += (uint8_t)(addr & 0xFU); addr >>= 4; - } - for (int j = 0; j < len; j++) { - uint8_t byte = GET_BYTE(to_push, j); - checksum += (uint8_t)(byte & 0xFU) + (byte >> 4U); - if (j == (len - 1)) { - checksum -= (byte & 0xFU); // remove checksum in message - } - } - return (uint8_t)((8U - checksum) & 0xFU); -} - -static uint8_t honda_get_counter(const CANPacket_t *to_push) { - int counter_byte = GET_LEN(to_push) - 1U; - return (GET_BYTE(to_push, counter_byte) >> 4U) & 0x3U; -} - -static void honda_rx_hook(const CANPacket_t *to_push) { - const bool pcm_cruise = ((honda_hw == HONDA_BOSCH) && !honda_bosch_long) || (honda_hw == HONDA_NIDEC); - int pt_bus = honda_get_pt_bus(); - - int addr = GET_ADDR(to_push); - int bus = GET_BUS(to_push); - - // sample speed - if (addr == 0x158) { - // first 2 bytes - vehicle_moving = GET_BYTE(to_push, 0) | GET_BYTE(to_push, 1); - } - - // check ACC main state - // 0x326 for all Bosch and some Nidec, 0x1A6 for some Nidec - if ((addr == 0x326) || (addr == 0x1A6)) { - acc_main_on = GET_BIT(to_push, ((addr == 0x326) ? 28U : 47U)); - if (!acc_main_on) { - controls_allowed = false; - } - } - - // enter controls when PCM enters cruise state - if (pcm_cruise && (addr == 0x17C)) { - const bool cruise_engaged = GET_BIT(to_push, 38U); - // engage on rising edge - if (cruise_engaged && !cruise_engaged_prev) { - controls_allowed = true; - } - - // Since some Nidec cars can brake down to 0 after the PCM disengages, - // we don't disengage when the PCM does. - if (!cruise_engaged && (honda_hw != HONDA_NIDEC)) { - controls_allowed = false; - } - cruise_engaged_prev = cruise_engaged; - } - - // state machine to enter and exit controls for button enabling - // 0x1A6 for the ILX, 0x296 for the Civic Touring - if (((addr == 0x1A6) || (addr == 0x296)) && (bus == pt_bus)) { - int button = (GET_BYTE(to_push, 0) & 0xE0U) >> 5; - - // enter controls on the falling edge of set or resume - bool set = (button != HONDA_BTN_SET) && (cruise_button_prev == HONDA_BTN_SET); - bool res = (button != HONDA_BTN_RESUME) && (cruise_button_prev == HONDA_BTN_RESUME); - if (acc_main_on && !pcm_cruise && (set || res)) { - controls_allowed = true; - } - - // exit controls once main or cancel are pressed - if ((button == HONDA_BTN_MAIN) || (button == HONDA_BTN_CANCEL)) { - controls_allowed = false; - } - cruise_button_prev = button; - } - - // user brake signal on 0x17C reports applied brake from computer brake on accord - // and crv, which prevents the usual brake safety from working correctly. these - // cars have a signal on 0x1BE which only detects user's brake being applied so - // in these cases, this is used instead. - // most hondas: 0x17C - // accord, crv: 0x1BE - if (honda_alt_brake_msg) { - if (addr == 0x1BE) { - brake_pressed = GET_BIT(to_push, 4U); - } - } else { - if (addr == 0x17C) { - // also if brake switch is 1 for two CAN frames, as brake pressed is delayed - const bool brake_switch = GET_BIT(to_push, 32U); - brake_pressed = (GET_BIT(to_push, 53U)) || (brake_switch && honda_brake_switch_prev); - honda_brake_switch_prev = brake_switch; - } - } - - if (addr == 0x17C) { - gas_pressed = GET_BYTE(to_push, 0) != 0U; - } - - // disable stock Honda AEB in alternative experience - if (!(alternative_experience & ALT_EXP_DISABLE_STOCK_AEB)) { - if ((bus == 2) && (addr == 0x1FA)) { - bool honda_stock_aeb = GET_BIT(to_push, 29U); - int honda_stock_brake = (GET_BYTE(to_push, 0) << 2) | (GET_BYTE(to_push, 1) >> 6); - - // Forward AEB when stock braking is higher than openpilot braking - // only stop forwarding when AEB event is over - if (!honda_stock_aeb) { - honda_fwd_brake = false; - } else if (honda_stock_brake >= honda_brake) { - honda_fwd_brake = true; - } else { - // Leave Honda forward brake as is - } - } - } - - int bus_rdr_car = (honda_hw == HONDA_BOSCH) ? 0 : 2; // radar bus, car side - bool stock_ecu_detected = false; - - // If steering controls messages are received on the destination bus, it's an indication - // that the relay might be malfunctioning - if ((addr == 0xE4) || (addr == 0x194)) { - if (((honda_hw != HONDA_NIDEC) && (bus == bus_rdr_car)) || ((honda_hw == HONDA_NIDEC) && (bus == 0))) { - stock_ecu_detected = true; - } - } - // If Honda Bosch longitudinal mode is selected we need to ensure the radar is turned off - // Verify this by ensuring ACC_CONTROL (0x1DF) is not received on the PT bus - if (honda_bosch_long && !honda_bosch_radarless && (bus == pt_bus) && (addr == 0x1DF)) { - stock_ecu_detected = true; - } - - generic_rx_checks(stock_ecu_detected); - -} - -static bool honda_tx_hook(const CANPacket_t *to_send) { - - const LongitudinalLimits HONDA_BOSCH_LONG_LIMITS = { - .max_accel = 200, // accel is used for brakes - .min_accel = -350, - - .max_gas = 2000, - .inactive_gas = -30000, - }; - - const LongitudinalLimits HONDA_NIDEC_LONG_LIMITS = { - .max_gas = 198, // 0xc6 - .max_brake = 255, - - .inactive_speed = 0, - }; - - bool tx = true; - int addr = GET_ADDR(to_send); - int bus = GET_BUS(to_send); - - int bus_pt = honda_get_pt_bus(); - int bus_buttons = (honda_bosch_radarless) ? 2 : bus_pt; // the camera controls ACC on radarless Bosch cars - - // ACC_HUD: safety check (nidec w/o pedal) - if ((addr == 0x30C) && (bus == bus_pt)) { - int pcm_speed = (GET_BYTE(to_send, 0) << 8) | GET_BYTE(to_send, 1); - int pcm_gas = GET_BYTE(to_send, 2); - - bool violation = false; - violation |= longitudinal_speed_checks(pcm_speed, HONDA_NIDEC_LONG_LIMITS); - violation |= longitudinal_gas_checks(pcm_gas, HONDA_NIDEC_LONG_LIMITS); - if (violation) { - tx = false; - } - } - - // BRAKE: safety check (nidec) - if ((addr == 0x1FA) && (bus == bus_pt)) { - honda_brake = (GET_BYTE(to_send, 0) << 2) + ((GET_BYTE(to_send, 1) >> 6) & 0x3U); - if (longitudinal_brake_checks(honda_brake, HONDA_NIDEC_LONG_LIMITS)) { - tx = false; - } - if (honda_fwd_brake) { - tx = false; - } - } - - // BRAKE/GAS: safety check (bosch) - if ((addr == 0x1DF) && (bus == bus_pt)) { - int accel = (GET_BYTE(to_send, 3) << 3) | ((GET_BYTE(to_send, 4) >> 5) & 0x7U); - accel = to_signed(accel, 11); - - int gas = (GET_BYTE(to_send, 0) << 8) | GET_BYTE(to_send, 1); - gas = to_signed(gas, 16); - - bool violation = false; - violation |= longitudinal_accel_checks(accel, HONDA_BOSCH_LONG_LIMITS); - violation |= longitudinal_gas_checks(gas, HONDA_BOSCH_LONG_LIMITS); - if (violation) { - tx = false; - } - } - - // ACCEL: safety check (radarless) - if ((addr == 0x1C8) && (bus == bus_pt)) { - int accel = (GET_BYTE(to_send, 0) << 4) | (GET_BYTE(to_send, 1) >> 4); - accel = to_signed(accel, 12); - - bool violation = false; - violation |= longitudinal_accel_checks(accel, HONDA_BOSCH_LONG_LIMITS); - if (violation) { - tx = false; - } - } - - // STEER: safety check - if ((addr == 0xE4) || (addr == 0x194)) { - if (!controls_allowed) { - bool steer_applied = GET_BYTE(to_send, 0) | GET_BYTE(to_send, 1); - if (steer_applied) { - tx = false; - } - } - } - - // Bosch supplemental control check - if (addr == 0xE5) { - if ((GET_BYTES(to_send, 0, 4) != 0x10800004U) || ((GET_BYTES(to_send, 4, 4) & 0x00FFFFFFU) != 0x0U)) { - tx = false; - } - } - - // FORCE CANCEL: safety check only relevant when spamming the cancel button in Bosch HW - // ensuring that only the cancel button press is sent (VAL 2) when controls are off. - // This avoids unintended engagements while still allowing resume spam - if ((addr == 0x296) && !controls_allowed && (bus == bus_buttons)) { - if (((GET_BYTE(to_send, 0) >> 5) & 0x7U) != 2U) { - tx = false; - } - } - - // Only tester present ("\x02\x3E\x80\x00\x00\x00\x00\x00") allowed on diagnostics address - if (addr == 0x18DAB0F1) { - if ((GET_BYTES(to_send, 0, 4) != 0x00803E02U) || (GET_BYTES(to_send, 4, 4) != 0x0U)) { - tx = false; - } - } - - return tx; -} - -static safety_config honda_nidec_init(uint16_t param) { - static CanMsg HONDA_N_TX_MSGS[] = {{0xE4, 0, 5}, {0x194, 0, 4}, {0x1FA, 0, 8}, {0x30C, 0, 8}, {0x33D, 0, 5}}; - - const uint16_t HONDA_PARAM_NIDEC_ALT = 4; - - honda_hw = HONDA_NIDEC; - honda_brake = 0; - honda_brake_switch_prev = false; - honda_fwd_brake = false; - honda_alt_brake_msg = false; - honda_bosch_long = false; - honda_bosch_radarless = false; - - safety_config ret; - - bool enable_nidec_alt = GET_FLAG(param, HONDA_PARAM_NIDEC_ALT); - - if (enable_nidec_alt) { - // For Nidecs with main on signal on an alternate msg (missing 0x326) - static RxCheck honda_nidec_alt_rx_checks[] = { - HONDA_COMMON_NO_SCM_FEEDBACK_RX_CHECKS(0) - }; - - SET_RX_CHECKS(honda_nidec_alt_rx_checks, ret); - } else { - SET_RX_CHECKS(honda_common_rx_checks, ret); - } - - SET_TX_MSGS(HONDA_N_TX_MSGS, ret); - - return ret; -} - -static safety_config honda_bosch_init(uint16_t param) { - static CanMsg HONDA_BOSCH_TX_MSGS[] = {{0xE4, 0, 5}, {0xE5, 0, 8}, {0x296, 1, 4}, {0x33D, 0, 5}, {0x33DA, 0, 5}, {0x33DB, 0, 8}}; // Bosch - static CanMsg HONDA_BOSCH_LONG_TX_MSGS[] = {{0xE4, 1, 5}, {0x1DF, 1, 8}, {0x1EF, 1, 8}, {0x1FA, 1, 8}, {0x30C, 1, 8}, {0x33D, 1, 5}, {0x33DA, 1, 5}, {0x33DB, 1, 8}, {0x39F, 1, 8}, {0x18DAB0F1, 1, 8}}; // Bosch w/ gas and brakes - static CanMsg HONDA_RADARLESS_TX_MSGS[] = {{0xE4, 0, 5}, {0x296, 2, 4}, {0x33D, 0, 8}}; // Bosch radarless - static CanMsg HONDA_RADARLESS_LONG_TX_MSGS[] = {{0xE4, 0, 5}, {0x33D, 0, 8}, {0x1C8, 0, 8}, {0x30C, 0, 8}}; // Bosch radarless w/ gas and brakes - - const uint16_t HONDA_PARAM_ALT_BRAKE = 1; - const uint16_t HONDA_PARAM_RADARLESS = 8; - - static RxCheck honda_common_alt_brake_rx_checks[] = { - HONDA_COMMON_RX_CHECKS(0) - HONDA_ALT_BRAKE_ADDR_CHECK(0) - }; - - static RxCheck honda_bosch_alt_brake_rx_checks[] = { - HONDA_COMMON_RX_CHECKS(1) - HONDA_ALT_BRAKE_ADDR_CHECK(1) - }; - - // Bosch has pt on bus 1, verified 0x1A6 does not exist - static RxCheck honda_bosch_rx_checks[] = { - HONDA_COMMON_RX_CHECKS(1) - }; - - honda_hw = HONDA_BOSCH; - honda_brake_switch_prev = false; - honda_bosch_radarless = GET_FLAG(param, HONDA_PARAM_RADARLESS); - // Checking for alternate brake override from safety parameter - honda_alt_brake_msg = GET_FLAG(param, HONDA_PARAM_ALT_BRAKE); - - // radar disabled so allow gas/brakes -#ifdef ALLOW_DEBUG - const uint16_t HONDA_PARAM_BOSCH_LONG = 2; - honda_bosch_long = GET_FLAG(param, HONDA_PARAM_BOSCH_LONG); -#endif - - safety_config ret; - if (honda_bosch_radarless && honda_alt_brake_msg) { - SET_RX_CHECKS(honda_common_alt_brake_rx_checks, ret); - } else if (honda_bosch_radarless) { - SET_RX_CHECKS(honda_common_rx_checks, ret); - } else if (honda_alt_brake_msg) { - SET_RX_CHECKS(honda_bosch_alt_brake_rx_checks, ret); - } else { - SET_RX_CHECKS(honda_bosch_rx_checks, ret); - } - - if (honda_bosch_radarless) { - if (honda_bosch_long) { - SET_TX_MSGS(HONDA_RADARLESS_LONG_TX_MSGS, ret); - } else { - SET_TX_MSGS(HONDA_RADARLESS_TX_MSGS, ret); - } - } else { - if (honda_bosch_long) { - SET_TX_MSGS(HONDA_BOSCH_LONG_TX_MSGS, ret); - } else { - SET_TX_MSGS(HONDA_BOSCH_TX_MSGS, ret); - } - } - return ret; -} - -static int honda_nidec_fwd_hook(int bus_num, int addr) { - // fwd from car to camera. also fwd certain msgs from camera to car - // 0xE4 is steering on all cars except CRV and RDX, 0x194 for CRV and RDX, - // 0x1FA is brake control, 0x30C is acc hud, 0x33D is lkas hud - int bus_fwd = -1; - - if (bus_num == 0) { - bus_fwd = 2; - } - - if (bus_num == 2) { - // block stock lkas messages and stock acc messages (if OP is doing ACC) - bool is_lkas_msg = (addr == 0xE4) || (addr == 0x194) || (addr == 0x33D); - bool is_acc_hud_msg = addr == 0x30C; - bool is_brake_msg = addr == 0x1FA; - bool block_fwd = is_lkas_msg || is_acc_hud_msg || (is_brake_msg && !honda_fwd_brake); - if (!block_fwd) { - bus_fwd = 0; - } - } - - return bus_fwd; -} - -static int honda_bosch_fwd_hook(int bus_num, int addr) { - int bus_fwd = -1; - - if (bus_num == 0) { - bus_fwd = 2; - } - if (bus_num == 2) { - bool is_lkas_msg = (addr == 0xE4) || (addr == 0xE5) || (addr == 0x33D) || (addr == 0x33DA) || (addr == 0x33DB); - bool is_acc_msg = ((addr == 0x1C8) || (addr == 0x30C)) && honda_bosch_radarless && honda_bosch_long; - bool block_msg = is_lkas_msg || is_acc_msg; - if (!block_msg) { - bus_fwd = 0; - } - } - - return bus_fwd; -} - -const safety_hooks honda_nidec_hooks = { - .init = honda_nidec_init, - .rx = honda_rx_hook, - .tx = honda_tx_hook, - .fwd = honda_nidec_fwd_hook, - .get_counter = honda_get_counter, - .get_checksum = honda_get_checksum, - .compute_checksum = honda_compute_checksum, -}; - -const safety_hooks honda_bosch_hooks = { - .init = honda_bosch_init, - .rx = honda_rx_hook, - .tx = honda_tx_hook, - .fwd = honda_bosch_fwd_hook, - .get_counter = honda_get_counter, - .get_checksum = honda_get_checksum, - .compute_checksum = honda_compute_checksum, -}; diff --git a/opendbc/safety/safety/safety_hyundai.h b/opendbc/safety/safety/safety_hyundai.h deleted file mode 100644 index e4736313894..00000000000 --- a/opendbc/safety/safety/safety_hyundai.h +++ /dev/null @@ -1,369 +0,0 @@ -#pragma once - -#include "safety_declarations.h" -#include "safety_hyundai_common.h" - -#define HYUNDAI_LIMITS(steer, rate_up, rate_down) { \ - .max_steer = (steer), \ - .max_rate_up = (rate_up), \ - .max_rate_down = (rate_down), \ - .max_rt_delta = 112, \ - .max_rt_interval = 250000, \ - .driver_torque_allowance = 50, \ - .driver_torque_multiplier = 2, \ - .type = TorqueDriverLimited, \ - /* the EPS faults when the steering angle is above a certain threshold for too long. to prevent this, */ \ - /* we allow setting CF_Lkas_ActToi bit to 0 while maintaining the requested torque value for two consecutive frames */ \ - .min_valid_request_frames = 89, \ - .max_invalid_request_frames = 2, \ - .min_valid_request_rt_interval = 810000, /* 810ms; a ~10% buffer on cutting every 90 frames */ \ - .has_steer_req_tolerance = true, \ -} - -extern const LongitudinalLimits HYUNDAI_LONG_LIMITS; -const LongitudinalLimits HYUNDAI_LONG_LIMITS = { - .max_accel = 200, // 1/100 m/s2 - .min_accel = -350, // 1/100 m/s2 -}; - -#define HYUNDAI_COMMON_TX_MSGS(scc_bus) \ - {0x340, 0, 8}, /* LKAS11 Bus 0 */ \ - {0x4F1, scc_bus, 4}, /* CLU11 Bus 0 (radar-SCC) or 2 (camera-SCC) */ \ - {0x485, 0, 4}, /* LFAHDA_MFC Bus 0 */ \ - -#define HYUNDAI_LONG_COMMON_TX_MSGS(scc_bus) \ - HYUNDAI_COMMON_TX_MSGS(scc_bus) \ - {0x420, 0, 8}, /* SCC11 Bus 0 */ \ - {0x421, 0, 8}, /* SCC12 Bus 0 */ \ - {0x50A, 0, 8}, /* SCC13 Bus 0 */ \ - {0x389, 0, 8}, /* SCC14 Bus 0 */ \ - {0x4A2, 0, 2}, /* FRT_RADAR11 Bus 0 */ \ - -#define HYUNDAI_COMMON_RX_CHECKS(legacy) \ - {.msg = {{0x260, 0, 8, .max_counter = 3U, .frequency = 100U}, \ - {0x371, 0, 8, .ignore_checksum = true, .ignore_counter = true, .frequency = 100U}, \ - {0x91, 0, 8, .ignore_checksum = true, .ignore_counter = true, .frequency = 100U}}}, \ - {.msg = {{0x386, 0, 8, .ignore_checksum = (legacy), .ignore_counter = (legacy), .max_counter = (legacy) ? 0U : 15U, .frequency = 100U}, { 0 }, { 0 }}}, \ - {.msg = {{0x394, 0, 8, .ignore_checksum = (legacy), .ignore_counter = (legacy), .max_counter = (legacy) ? 0U : 7U, .frequency = 100U}, { 0 }, { 0 }}}, \ - -#define HYUNDAI_SCC12_ADDR_CHECK(scc_bus) \ - {.msg = {{0x421, (scc_bus), 8, .max_counter = 15U, .frequency = 50U}, { 0 }, { 0 }}}, \ - -static const CanMsg HYUNDAI_TX_MSGS[] = { - HYUNDAI_COMMON_TX_MSGS(0) -}; - -static bool hyundai_legacy = false; - -static uint8_t hyundai_get_counter(const CANPacket_t *to_push) { - int addr = GET_ADDR(to_push); - - uint8_t cnt = 0; - if (addr == 0x260) { - cnt = (GET_BYTE(to_push, 7) >> 4) & 0x3U; - } else if (addr == 0x386) { - cnt = ((GET_BYTE(to_push, 3) >> 6) << 2) | (GET_BYTE(to_push, 1) >> 6); - } else if (addr == 0x394) { - cnt = (GET_BYTE(to_push, 1) >> 5) & 0x7U; - } else if (addr == 0x421) { - cnt = GET_BYTE(to_push, 7) & 0xFU; - } else if (addr == 0x4F1) { - cnt = (GET_BYTE(to_push, 3) >> 4) & 0xFU; - } else { - } - return cnt; -} - -static uint32_t hyundai_get_checksum(const CANPacket_t *to_push) { - int addr = GET_ADDR(to_push); - - uint8_t chksum = 0; - if (addr == 0x260) { - chksum = GET_BYTE(to_push, 7) & 0xFU; - } else if (addr == 0x386) { - chksum = ((GET_BYTE(to_push, 7) >> 6) << 2) | (GET_BYTE(to_push, 5) >> 6); - } else if (addr == 0x394) { - chksum = GET_BYTE(to_push, 6) & 0xFU; - } else if (addr == 0x421) { - chksum = GET_BYTE(to_push, 7) >> 4; - } else { - } - return chksum; -} - -static uint32_t hyundai_compute_checksum(const CANPacket_t *to_push) { - int addr = GET_ADDR(to_push); - - uint8_t chksum = 0; - if (addr == 0x386) { - // count the bits - for (int i = 0; i < 8; i++) { - uint8_t b = GET_BYTE(to_push, i); - for (int j = 0; j < 8; j++) { - uint8_t bit = 0; - // exclude checksum and counter - if (((i != 1) || (j < 6)) && ((i != 3) || (j < 6)) && ((i != 5) || (j < 6)) && ((i != 7) || (j < 6))) { - bit = (b >> (uint8_t)j) & 1U; - } - chksum += bit; - } - } - chksum = (chksum ^ 9U) & 15U; - } else { - // sum of nibbles - for (int i = 0; i < 8; i++) { - if ((addr == 0x394) && (i == 7)) { - continue; // exclude - } - uint8_t b = GET_BYTE(to_push, i); - if (((addr == 0x260) && (i == 7)) || ((addr == 0x394) && (i == 6)) || ((addr == 0x421) && (i == 7))) { - b &= (addr == 0x421) ? 0x0FU : 0xF0U; // remove checksum - } - chksum += (b % 16U) + (b / 16U); - } - chksum = (16U - (chksum % 16U)) % 16U; - } - - return chksum; -} - -static void hyundai_rx_hook(const CANPacket_t *to_push) { - int bus = GET_BUS(to_push); - int addr = GET_ADDR(to_push); - - // SCC12 is on bus 2 for camera-based SCC cars, bus 0 on all others - if (addr == 0x421) { - if (((bus == 0) && !hyundai_camera_scc) || ((bus == 2) && hyundai_camera_scc)) { - // 2 bits: 13-14 - int cruise_engaged = (GET_BYTES(to_push, 0, 4) >> 13) & 0x3U; - hyundai_common_cruise_state_check(cruise_engaged); - } - } - - if (bus == 0) { - if (addr == 0x251) { - int torque_driver_new = (GET_BYTES(to_push, 0, 2) & 0x7ffU) - 1024U; - // update array of samples - update_sample(&torque_driver, torque_driver_new); - } - - // ACC steering wheel buttons - if (addr == 0x4F1) { - int cruise_button = GET_BYTE(to_push, 0) & 0x7U; - bool main_button = GET_BIT(to_push, 3U); - hyundai_common_cruise_buttons_check(cruise_button, main_button); - } - - // gas press, different for EV, hybrid, and ICE models - if ((addr == 0x371) && hyundai_ev_gas_signal) { - gas_pressed = (((GET_BYTE(to_push, 4) & 0x7FU) << 1) | GET_BYTE(to_push, 3) >> 7) != 0U; - } else if ((addr == 0x371) && hyundai_hybrid_gas_signal) { - gas_pressed = GET_BYTE(to_push, 7) != 0U; - } else if ((addr == 0x91) && hyundai_fcev_gas_signal) { - gas_pressed = GET_BYTE(to_push, 6) != 0U; - } else if ((addr == 0x260) && !hyundai_ev_gas_signal && !hyundai_hybrid_gas_signal) { - gas_pressed = (GET_BYTE(to_push, 7) >> 6) != 0U; - } else { - } - - // sample wheel speed, averaging opposite corners - if (addr == 0x386) { - uint32_t front_left_speed = GET_BYTES(to_push, 0, 2) & 0x3FFFU; - uint32_t rear_right_speed = GET_BYTES(to_push, 6, 2) & 0x3FFFU; - vehicle_moving = (front_left_speed > HYUNDAI_STANDSTILL_THRSLD) || (rear_right_speed > HYUNDAI_STANDSTILL_THRSLD); - } - - if (addr == 0x394) { - brake_pressed = ((GET_BYTE(to_push, 5) >> 5U) & 0x3U) == 0x2U; - } - - bool stock_ecu_detected = (addr == 0x340); - - // If openpilot is controlling longitudinal we need to ensure the radar is turned off - // Enforce by checking we don't see SCC12 - if (hyundai_longitudinal && !hyundai_camera_scc && (addr == 0x421)) { - stock_ecu_detected = true; - } - generic_rx_checks(stock_ecu_detected); - } -} - -static bool hyundai_tx_hook(const CANPacket_t *to_send) { - const TorqueSteeringLimits HYUNDAI_STEERING_LIMITS = HYUNDAI_LIMITS(384, 3, 7); - const TorqueSteeringLimits HYUNDAI_STEERING_LIMITS_ALT = HYUNDAI_LIMITS(270, 2, 3); - const TorqueSteeringLimits HYUNDAI_STEERING_LIMITS_ALT_2 = HYUNDAI_LIMITS(170, 2, 3); - - bool tx = true; - int addr = GET_ADDR(to_send); - - // FCA11: Block any potential actuation - if (addr == 0x38D) { - int CR_VSM_DecCmd = GET_BYTE(to_send, 1); - bool FCA_CmdAct = GET_BIT(to_send, 20U); - bool CF_VSM_DecCmdAct = GET_BIT(to_send, 31U); - - if ((CR_VSM_DecCmd != 0) || FCA_CmdAct || CF_VSM_DecCmdAct) { - tx = false; - } - } - - // ACCEL: safety check - if (addr == 0x421) { - int desired_accel_raw = (((GET_BYTE(to_send, 4) & 0x7U) << 8) | GET_BYTE(to_send, 3)) - 1023U; - int desired_accel_val = ((GET_BYTE(to_send, 5) << 3) | (GET_BYTE(to_send, 4) >> 5)) - 1023U; - - int aeb_decel_cmd = GET_BYTE(to_send, 2); - bool aeb_req = GET_BIT(to_send, 54U); - - bool violation = false; - - violation |= longitudinal_accel_checks(desired_accel_raw, HYUNDAI_LONG_LIMITS); - violation |= longitudinal_accel_checks(desired_accel_val, HYUNDAI_LONG_LIMITS); - violation |= (aeb_decel_cmd != 0); - violation |= aeb_req; - - if (violation) { - tx = false; - } - } - - // LKA STEER: safety check - if (addr == 0x340) { - int desired_torque = ((GET_BYTES(to_send, 0, 4) >> 16) & 0x7ffU) - 1024U; - bool steer_req = GET_BIT(to_send, 27U); - - const TorqueSteeringLimits limits = hyundai_alt_limits_2 ? HYUNDAI_STEERING_LIMITS_ALT_2 : - hyundai_alt_limits ? HYUNDAI_STEERING_LIMITS_ALT : HYUNDAI_STEERING_LIMITS; - - if (steer_torque_cmd_checks(desired_torque, steer_req, limits)) { - tx = false; - } - } - - // UDS: Only tester present ("\x02\x3E\x80\x00\x00\x00\x00\x00") allowed on diagnostics address - if (addr == 0x7D0) { - if ((GET_BYTES(to_send, 0, 4) != 0x00803E02U) || (GET_BYTES(to_send, 4, 4) != 0x0U)) { - tx = false; - } - } - - // BUTTONS: used for resume spamming and cruise cancellation - if ((addr == 0x4F1) && !hyundai_longitudinal) { - int button = GET_BYTE(to_send, 0) & 0x7U; - - bool allowed_resume = (button == 1) && controls_allowed; - bool allowed_cancel = (button == 4) && cruise_engaged_prev; - if (!(allowed_resume || allowed_cancel)) { - tx = false; - } - } - - return tx; -} - -static int hyundai_fwd_hook(int bus_num, int addr) { - - int bus_fwd = -1; - - // forward cam to ccan and viceversa, except lkas cmd - if (bus_num == 0) { - bus_fwd = 2; - } - - if (bus_num == 2) { - // Stock LKAS11 messages - bool is_lkas_11 = (addr == 0x340); - // LFA and HDA cluster icons - bool is_lfahda_mfc = (addr == 0x485); - // Stock SCC messages, blocking when doing openpilot longitudinal on camera SCC cars - bool is_scc_msg = (addr == 0x420) || (addr == 0x421) || (addr == 0x50A) || (addr == 0x389); - - bool block_msg = is_lkas_11 || is_lfahda_mfc || (is_scc_msg && hyundai_longitudinal && hyundai_camera_scc); - if (!block_msg) { - bus_fwd = 0; - } - } - - return bus_fwd; -} - -static safety_config hyundai_init(uint16_t param) { - static const CanMsg HYUNDAI_LONG_TX_MSGS[] = { - HYUNDAI_LONG_COMMON_TX_MSGS(0) - {0x38D, 0, 8}, // FCA11 Bus 0 - {0x483, 0, 8}, // FCA12 Bus 0 - {0x7D0, 0, 8}, // radar UDS TX addr Bus 0 (for radar disable) - }; - - static const CanMsg HYUNDAI_CAMERA_SCC_TX_MSGS[] = { - HYUNDAI_COMMON_TX_MSGS(2) - }; - - static const CanMsg HYUNDAI_CAMERA_SCC_LONG_TX_MSGS[] = { - HYUNDAI_LONG_COMMON_TX_MSGS(2) - }; - - hyundai_common_init(param); - hyundai_legacy = false; - - safety_config ret; - if (hyundai_longitudinal) { - static RxCheck hyundai_long_rx_checks[] = { - HYUNDAI_COMMON_RX_CHECKS(false) - // Use CLU11 (buttons) to manage controls allowed instead of SCC cruise state - {.msg = {{0x4F1, 0, 4, .ignore_checksum = true, .max_counter = 15U, .frequency = 50U}, { 0 }, { 0 }}}, - }; - - ret = hyundai_camera_scc ? BUILD_SAFETY_CFG(hyundai_long_rx_checks, HYUNDAI_CAMERA_SCC_LONG_TX_MSGS) : \ - BUILD_SAFETY_CFG(hyundai_long_rx_checks, HYUNDAI_LONG_TX_MSGS); - } else if (hyundai_camera_scc) { - static RxCheck hyundai_cam_scc_rx_checks[] = { - HYUNDAI_COMMON_RX_CHECKS(false) - HYUNDAI_SCC12_ADDR_CHECK(2) - }; - - ret = BUILD_SAFETY_CFG(hyundai_cam_scc_rx_checks, HYUNDAI_CAMERA_SCC_TX_MSGS); - } else { - static RxCheck hyundai_rx_checks[] = { - HYUNDAI_COMMON_RX_CHECKS(false) - HYUNDAI_SCC12_ADDR_CHECK(0) - }; - - ret = BUILD_SAFETY_CFG(hyundai_rx_checks, HYUNDAI_TX_MSGS); - } - return ret; -} - -static safety_config hyundai_legacy_init(uint16_t param) { - // older hyundai models have less checks due to missing counters and checksums - static RxCheck hyundai_legacy_rx_checks[] = { - HYUNDAI_COMMON_RX_CHECKS(true) - HYUNDAI_SCC12_ADDR_CHECK(0) - }; - - hyundai_common_init(param); - hyundai_legacy = true; - hyundai_longitudinal = false; - hyundai_camera_scc = false; - return BUILD_SAFETY_CFG(hyundai_legacy_rx_checks, HYUNDAI_TX_MSGS); -} - -const safety_hooks hyundai_hooks = { - .init = hyundai_init, - .rx = hyundai_rx_hook, - .tx = hyundai_tx_hook, - .fwd = hyundai_fwd_hook, - .get_counter = hyundai_get_counter, - .get_checksum = hyundai_get_checksum, - .compute_checksum = hyundai_compute_checksum, -}; - -const safety_hooks hyundai_legacy_hooks = { - .init = hyundai_legacy_init, - .rx = hyundai_rx_hook, - .tx = hyundai_tx_hook, - .fwd = hyundai_fwd_hook, - .get_counter = hyundai_get_counter, - .get_checksum = hyundai_get_checksum, - .compute_checksum = hyundai_compute_checksum, -}; diff --git a/opendbc/safety/safety/safety_hyundai_canfd.h b/opendbc/safety/safety/safety_hyundai_canfd.h deleted file mode 100644 index 95811b9ec51..00000000000 --- a/opendbc/safety/safety/safety_hyundai_canfd.h +++ /dev/null @@ -1,365 +0,0 @@ -#pragma once - -#include "safety_declarations.h" -#include "safety_hyundai_common.h" - -#define HYUNDAI_CANFD_CRUISE_BUTTON_TX_MSGS(bus) \ - {0x1CF, bus, 8}, /* CRUISE_BUTTON */ \ - -#define HYUNDAI_CANFD_LKA_STEERING_COMMON_TX_MSGS(a_can, e_can) \ - HYUNDAI_CANFD_CRUISE_BUTTON_TX_MSGS(e_can) \ - {0x50, a_can, 16}, /* LKAS */ \ - {0x2A4, a_can, 24}, /* CAM_0x2A4 */ \ - -#define HYUNDAI_CANFD_LKA_STEERING_ALT_COMMON_TX_MSGS(a_can, e_can) \ - HYUNDAI_CANFD_CRUISE_BUTTON_TX_MSGS(e_can) \ - {0x110, a_can, 32}, /* LKAS_ALT */ \ - {0x362, a_can, 32}, /* CAM_0x362 */ \ - -#define HYUNDAI_CANFD_LFA_STEERING_COMMON_TX_MSGS(e_can) \ - {0x12A, e_can, 16}, /* LFA */ \ - {0x1E0, e_can, 16}, /* LFAHDA_CLUSTER */ \ - -#define HYUNDAI_CANFD_SCC_CONTROL_COMMON_TX_MSGS(e_can) \ - {0x1A0, e_can, 32}, /* SCC_CONTROL */ \ - -// *** Addresses checked in rx hook *** -// EV, ICE, HYBRID: ACCELERATOR (0x35), ACCELERATOR_BRAKE_ALT (0x100), ACCELERATOR_ALT (0x105) -#define HYUNDAI_CANFD_COMMON_RX_CHECKS(pt_bus) \ - {.msg = {{0x35, (pt_bus), 32, .max_counter = 0xffU, .frequency = 100U}, \ - {0x100, (pt_bus), 32, .max_counter = 0xffU, .frequency = 100U}, \ - {0x105, (pt_bus), 32, .max_counter = 0xffU, .frequency = 100U}}}, \ - {.msg = {{0x175, (pt_bus), 24, .max_counter = 0xffU, .frequency = 50U}, { 0 }, { 0 }}}, \ - {.msg = {{0xa0, (pt_bus), 24, .max_counter = 0xffU, .frequency = 100U}, { 0 }, { 0 }}}, \ - {.msg = {{0xea, (pt_bus), 24, .max_counter = 0xffU, .frequency = 100U}, { 0 }, { 0 }}}, \ - {.msg = {{0x1cf, (pt_bus), 8, .ignore_checksum = true, .max_counter = 0xfU, .frequency = 50U}, \ - {0x1aa, (pt_bus), 16, .ignore_checksum = true, .max_counter = 0xffU, .frequency = 50U}, { 0 }}}, \ - -// SCC_CONTROL (from ADAS unit or camera) -#define HYUNDAI_CANFD_SCC_ADDR_CHECK(scc_bus) \ - {.msg = {{0x1a0, (scc_bus), 32, .max_counter = 0xffU, .frequency = 50U}, { 0 }, { 0 }}}, \ - -static bool hyundai_canfd_alt_buttons = false; -static bool hyundai_canfd_lka_steering_alt = false; - -static int hyundai_canfd_get_lka_addr(void) { - return hyundai_canfd_lka_steering_alt ? 0x110 : 0x50; -} - -static uint8_t hyundai_canfd_get_counter(const CANPacket_t *to_push) { - uint8_t ret = 0; - if (GET_LEN(to_push) == 8U) { - ret = GET_BYTE(to_push, 1) >> 4; - } else { - ret = GET_BYTE(to_push, 2); - } - return ret; -} - -static uint32_t hyundai_canfd_get_checksum(const CANPacket_t *to_push) { - uint32_t chksum = GET_BYTE(to_push, 0) | (GET_BYTE(to_push, 1) << 8); - return chksum; -} - -static void hyundai_canfd_rx_hook(const CANPacket_t *to_push) { - int bus = GET_BUS(to_push); - int addr = GET_ADDR(to_push); - - const int pt_bus = hyundai_canfd_lka_steering ? 1 : 0; - const int scc_bus = hyundai_camera_scc ? 2 : pt_bus; - - if (bus == pt_bus) { - // driver torque - if (addr == 0xea) { - int torque_driver_new = ((GET_BYTE(to_push, 11) & 0x1fU) << 8U) | GET_BYTE(to_push, 10); - torque_driver_new -= 4095; - update_sample(&torque_driver, torque_driver_new); - } - - // cruise buttons - const int button_addr = hyundai_canfd_alt_buttons ? 0x1aa : 0x1cf; - if (addr == button_addr) { - bool main_button = false; - int cruise_button = 0; - if (addr == 0x1cf) { - cruise_button = GET_BYTE(to_push, 2) & 0x7U; - main_button = GET_BIT(to_push, 19U); - } else { - cruise_button = (GET_BYTE(to_push, 4) >> 4) & 0x7U; - main_button = GET_BIT(to_push, 34U); - } - hyundai_common_cruise_buttons_check(cruise_button, main_button); - } - - // gas press, different for EV, hybrid, and ICE models - if ((addr == 0x35) && hyundai_ev_gas_signal) { - gas_pressed = GET_BYTE(to_push, 5) != 0U; - } else if ((addr == 0x105) && hyundai_hybrid_gas_signal) { - gas_pressed = GET_BIT(to_push, 103U) || (GET_BYTE(to_push, 13) != 0U) || GET_BIT(to_push, 112U); - } else if ((addr == 0x100) && !hyundai_ev_gas_signal && !hyundai_hybrid_gas_signal) { - gas_pressed = GET_BIT(to_push, 176U); - } else { - } - - // brake press - if (addr == 0x175) { - brake_pressed = GET_BIT(to_push, 81U); - } - - // vehicle moving - if (addr == 0xa0) { - uint32_t fl = (GET_BYTES(to_push, 8, 2)) & 0x3FFFU; - uint32_t fr = (GET_BYTES(to_push, 10, 2)) & 0x3FFFU; - uint32_t rl = (GET_BYTES(to_push, 12, 2)) & 0x3FFFU; - uint32_t rr = (GET_BYTES(to_push, 14, 2)) & 0x3FFFU; - vehicle_moving = (fl > HYUNDAI_STANDSTILL_THRSLD) || (fr > HYUNDAI_STANDSTILL_THRSLD) || - (rl > HYUNDAI_STANDSTILL_THRSLD) || (rr > HYUNDAI_STANDSTILL_THRSLD); - - // average of all 4 wheel speeds. Conversion: raw * 0.03125 / 3.6 = m/s - UPDATE_VEHICLE_SPEED((fr + rr + rl + fl) / 4.0 * 0.03125 / 3.6); - } - } - - if (bus == scc_bus) { - // cruise state - if ((addr == 0x1a0) && !hyundai_longitudinal) { - // 1=enabled, 2=driver override - int cruise_status = ((GET_BYTE(to_push, 8) >> 4) & 0x7U); - bool cruise_engaged = (cruise_status == 1) || (cruise_status == 2); - hyundai_common_cruise_state_check(cruise_engaged); - } - } - - const int steer_addr = hyundai_canfd_lka_steering ? hyundai_canfd_get_lka_addr() : 0x12a; - bool stock_ecu_detected = (addr == steer_addr) && (bus == 0); - if (hyundai_longitudinal) { - // on LKA steering cars, ensure ADRV ECU is still knocked out - // on others, ensure accel msg is blocked from camera - stock_ecu_detected = stock_ecu_detected || ((addr == 0x1a0) && (bus == pt_bus)); - } - generic_rx_checks(stock_ecu_detected); -} - -static bool hyundai_canfd_tx_hook(const CANPacket_t *to_send) { - const TorqueSteeringLimits HYUNDAI_CANFD_STEERING_LIMITS = { - .max_steer = 270, - .max_rt_delta = 112, - .max_rt_interval = 250000, - .max_rate_up = 2, - .max_rate_down = 3, - .driver_torque_allowance = 250, - .driver_torque_multiplier = 2, - .type = TorqueDriverLimited, - - // the EPS faults when the steering angle is above a certain threshold for too long. to prevent this, - // we allow setting torque actuation bit to 0 while maintaining the requested torque value for two consecutive frames - .min_valid_request_frames = 89, - .max_invalid_request_frames = 2, - .min_valid_request_rt_interval = 810000, // 810ms; a ~10% buffer on cutting every 90 frames - .has_steer_req_tolerance = true, - }; - - bool tx = true; - int addr = GET_ADDR(to_send); - - // steering - const int steer_addr = (hyundai_canfd_lka_steering && !hyundai_longitudinal) ? hyundai_canfd_get_lka_addr() : 0x12a; - if (addr == steer_addr) { - int desired_torque = (((GET_BYTE(to_send, 6) & 0xFU) << 7U) | (GET_BYTE(to_send, 5) >> 1U)) - 1024U; - bool steer_req = GET_BIT(to_send, 52U); - - if (steer_torque_cmd_checks(desired_torque, steer_req, HYUNDAI_CANFD_STEERING_LIMITS)) { - tx = false; - } - } - - // cruise buttons check - if (addr == 0x1cf) { - int button = GET_BYTE(to_send, 2) & 0x7U; - bool is_cancel = (button == HYUNDAI_BTN_CANCEL); - bool is_resume = (button == HYUNDAI_BTN_RESUME); - - bool allowed = (is_cancel && cruise_engaged_prev) || (is_resume && controls_allowed); - if (!allowed) { - tx = false; - } - } - - // UDS: only tester present ("\x02\x3E\x80\x00\x00\x00\x00\x00") allowed on diagnostics address - if (((addr == 0x730) && hyundai_canfd_lka_steering) || ((addr == 0x7D0) && !hyundai_camera_scc)) { - if ((GET_BYTES(to_send, 0, 4) != 0x00803E02U) || (GET_BYTES(to_send, 4, 4) != 0x0U)) { - tx = false; - } - } - - // ACCEL: safety check - if (addr == 0x1a0) { - int desired_accel_raw = (((GET_BYTE(to_send, 17) & 0x7U) << 8) | GET_BYTE(to_send, 16)) - 1023U; - int desired_accel_val = ((GET_BYTE(to_send, 18) << 4) | (GET_BYTE(to_send, 17) >> 4)) - 1023U; - - bool violation = false; - - if (hyundai_longitudinal) { - violation |= longitudinal_accel_checks(desired_accel_raw, HYUNDAI_LONG_LIMITS); - violation |= longitudinal_accel_checks(desired_accel_val, HYUNDAI_LONG_LIMITS); - } else { - // only used to cancel on here - const int acc_mode = (GET_BYTE(to_send, 8) >> 4) & 0x7U; - if (acc_mode != 4) { - violation = true; - } - - if ((desired_accel_raw != 0) || (desired_accel_val != 0)) { - violation = true; - } - } - - if (violation) { - tx = false; - } - } - - return tx; -} - -static int hyundai_canfd_fwd_hook(int bus_num, int addr) { - int bus_fwd = -1; - - if (bus_num == 0) { - bus_fwd = 2; - } - if (bus_num == 2) { - // LKAS for cars with LKAS and LFA messages, LFA for cars with no LKAS messages - int lfa_block_addr = hyundai_canfd_lka_steering_alt ? 0x362 : 0x2a4; - bool is_lka_msg = ((addr == hyundai_canfd_get_lka_addr()) || (addr == lfa_block_addr)) && hyundai_canfd_lka_steering; - bool is_lfa_msg = ((addr == 0x12a) && !hyundai_canfd_lka_steering); - - // HUD icons - bool is_lfahda_msg = ((addr == 0x1e0) && !hyundai_canfd_lka_steering); - - // SCC_CONTROL and ADRV_0x160 for camera SCC cars, we send our own longitudinal commands and to show FCA light - bool is_scc_msg = (((addr == 0x1a0) || (addr == 0x160)) && hyundai_longitudinal && !hyundai_canfd_lka_steering); - - bool block_msg = is_lka_msg || is_lfa_msg || is_lfahda_msg || is_scc_msg; - if (!block_msg) { - bus_fwd = 0; - } - } - - return bus_fwd; -} - -static safety_config hyundai_canfd_init(uint16_t param) { - const int HYUNDAI_PARAM_CANFD_LKA_STEERING_ALT = 128; - const int HYUNDAI_PARAM_CANFD_ALT_BUTTONS = 32; - - static const CanMsg HYUNDAI_CANFD_LKA_STEERING_TX_MSGS[] = { - HYUNDAI_CANFD_LKA_STEERING_COMMON_TX_MSGS(0, 1) - }; - - static const CanMsg HYUNDAI_CANFD_LKA_STEERING_ALT_TX_MSGS[] = { - HYUNDAI_CANFD_LKA_STEERING_ALT_COMMON_TX_MSGS(0, 1) - }; - - static const CanMsg HYUNDAI_CANFD_LKA_STEERING_LONG_TX_MSGS[] = { - HYUNDAI_CANFD_LKA_STEERING_COMMON_TX_MSGS(0, 1) - HYUNDAI_CANFD_LFA_STEERING_COMMON_TX_MSGS(1) - HYUNDAI_CANFD_SCC_CONTROL_COMMON_TX_MSGS(1) - {0x51, 0, 32}, // ADRV_0x51 - {0x730, 1, 8}, // tester present for ADAS ECU disable - {0x160, 1, 16}, // ADRV_0x160 - {0x1EA, 1, 32}, // ADRV_0x1ea - {0x200, 1, 8}, // ADRV_0x200 - {0x345, 1, 8}, // ADRV_0x345 - {0x1DA, 1, 32}, // ADRV_0x1da - }; - - static const CanMsg HYUNDAI_CANFD_LFA_STEERING_TX_MSGS[] = { - HYUNDAI_CANFD_CRUISE_BUTTON_TX_MSGS(2) - HYUNDAI_CANFD_LFA_STEERING_COMMON_TX_MSGS(0) - HYUNDAI_CANFD_SCC_CONTROL_COMMON_TX_MSGS(0) - }; - - static const CanMsg HYUNDAI_CANFD_LFA_STEERING_LONG_TX_MSGS[] = { - HYUNDAI_CANFD_CRUISE_BUTTON_TX_MSGS(2) - HYUNDAI_CANFD_LFA_STEERING_COMMON_TX_MSGS(0) - HYUNDAI_CANFD_SCC_CONTROL_COMMON_TX_MSGS(0) - {0x160, 0, 16}, // ADRV_0x160 - {0x7D0, 0, 8}, // tester present for radar ECU disable - }; - - static const CanMsg HYUNDAI_CANFD_LFA_STEERING_CAMERA_SCC_TX_MSGS[] = { - HYUNDAI_CANFD_CRUISE_BUTTON_TX_MSGS(2) - HYUNDAI_CANFD_LFA_STEERING_COMMON_TX_MSGS(0) - HYUNDAI_CANFD_SCC_CONTROL_COMMON_TX_MSGS(0) - {0x160, 0, 16}, // ADRV_0x160 - }; - - hyundai_common_init(param); - - gen_crc_lookup_table_16(0x1021, hyundai_canfd_crc_lut); - hyundai_canfd_alt_buttons = GET_FLAG(param, HYUNDAI_PARAM_CANFD_ALT_BUTTONS); - hyundai_canfd_lka_steering_alt = GET_FLAG(param, HYUNDAI_PARAM_CANFD_LKA_STEERING_ALT); - - safety_config ret; - if (hyundai_longitudinal) { - if (hyundai_canfd_lka_steering) { - static RxCheck hyundai_canfd_lka_steering_long_rx_checks[] = { - HYUNDAI_CANFD_COMMON_RX_CHECKS(1) - }; - - ret = BUILD_SAFETY_CFG(hyundai_canfd_lka_steering_long_rx_checks, HYUNDAI_CANFD_LKA_STEERING_LONG_TX_MSGS); - } else { - // Longitudinal checks for LFA steering - static RxCheck hyundai_canfd_long_rx_checks[] = { - HYUNDAI_CANFD_COMMON_RX_CHECKS(0) - }; - - ret = hyundai_camera_scc ? BUILD_SAFETY_CFG(hyundai_canfd_long_rx_checks, HYUNDAI_CANFD_LFA_STEERING_CAMERA_SCC_TX_MSGS) : \ - BUILD_SAFETY_CFG(hyundai_canfd_long_rx_checks, HYUNDAI_CANFD_LFA_STEERING_LONG_TX_MSGS); - } - } else { - if (hyundai_canfd_lka_steering) { - // *** LKA steering checks *** - // E-CAN is on bus 1, SCC messages are sent on cars with ADRV ECU. - // Does not use the alt buttons message - static RxCheck hyundai_canfd_lka_steering_rx_checks[] = { - HYUNDAI_CANFD_COMMON_RX_CHECKS(1) - HYUNDAI_CANFD_SCC_ADDR_CHECK(1) - }; - - ret = hyundai_canfd_lka_steering_alt ? BUILD_SAFETY_CFG(hyundai_canfd_lka_steering_rx_checks, HYUNDAI_CANFD_LKA_STEERING_ALT_TX_MSGS) : \ - BUILD_SAFETY_CFG(hyundai_canfd_lka_steering_rx_checks, HYUNDAI_CANFD_LKA_STEERING_TX_MSGS); - } else if (!hyundai_camera_scc) { - // Radar sends SCC messages on these cars instead of camera - static RxCheck hyundai_canfd_radar_scc_rx_checks[] = { - HYUNDAI_CANFD_COMMON_RX_CHECKS(0) - HYUNDAI_CANFD_SCC_ADDR_CHECK(0) - }; - - ret = BUILD_SAFETY_CFG(hyundai_canfd_radar_scc_rx_checks, HYUNDAI_CANFD_LFA_STEERING_TX_MSGS); - } else { - // *** LFA steering checks *** - // Camera sends SCC messages on LFA steering cars. - // Both button messages exist on some platforms, so we ensure we track the correct one using flag - static RxCheck hyundai_canfd_rx_checks[] = { - HYUNDAI_CANFD_COMMON_RX_CHECKS(0) - HYUNDAI_CANFD_SCC_ADDR_CHECK(2) - }; - - ret = BUILD_SAFETY_CFG(hyundai_canfd_rx_checks, HYUNDAI_CANFD_LFA_STEERING_CAMERA_SCC_TX_MSGS); - } - } - - return ret; -} - -const safety_hooks hyundai_canfd_hooks = { - .init = hyundai_canfd_init, - .rx = hyundai_canfd_rx_hook, - .tx = hyundai_canfd_tx_hook, - .fwd = hyundai_canfd_fwd_hook, - .get_counter = hyundai_canfd_get_counter, - .get_checksum = hyundai_canfd_get_checksum, - .compute_checksum = hyundai_common_canfd_compute_checksum, -}; diff --git a/opendbc/safety/safety/safety_hyundai_common.h b/opendbc/safety/safety/safety_hyundai_common.h deleted file mode 100644 index afee9744269..00000000000 --- a/opendbc/safety/safety/safety_hyundai_common.h +++ /dev/null @@ -1,138 +0,0 @@ -#pragma once - -#include "safety_declarations.h" - -extern uint16_t hyundai_canfd_crc_lut[256]; -uint16_t hyundai_canfd_crc_lut[256]; - -static const uint8_t HYUNDAI_PREV_BUTTON_SAMPLES = 8; // roughly 160 ms - // -extern const uint32_t HYUNDAI_STANDSTILL_THRSLD; -const uint32_t HYUNDAI_STANDSTILL_THRSLD = 12; // 0.375 kph - -enum { - HYUNDAI_BTN_NONE = 0, - HYUNDAI_BTN_RESUME = 1, - HYUNDAI_BTN_SET = 2, - HYUNDAI_BTN_CANCEL = 4, -}; - -// common state -extern bool hyundai_ev_gas_signal; -bool hyundai_ev_gas_signal = false; - -extern bool hyundai_hybrid_gas_signal; -bool hyundai_hybrid_gas_signal = false; - -extern bool hyundai_longitudinal; -bool hyundai_longitudinal = false; - -extern bool hyundai_camera_scc; -bool hyundai_camera_scc = false; - -extern bool hyundai_canfd_lka_steering; -bool hyundai_canfd_lka_steering = false; - -extern bool hyundai_alt_limits; -bool hyundai_alt_limits = false; - -extern bool hyundai_fcev_gas_signal; -bool hyundai_fcev_gas_signal = false; - -extern bool hyundai_alt_limits_2; -bool hyundai_alt_limits_2 = false; - -static uint8_t hyundai_last_button_interaction; // button messages since the user pressed an enable button - -void hyundai_common_init(uint16_t param) { - const int HYUNDAI_PARAM_EV_GAS = 1; - const int HYUNDAI_PARAM_HYBRID_GAS = 2; - const int HYUNDAI_PARAM_CAMERA_SCC = 8; - const int HYUNDAI_PARAM_CANFD_LKA_STEERING = 16; - const int HYUNDAI_PARAM_ALT_LIMITS = 64; // TODO: shift this down with the rest of the common flags - const int HYUNDAI_PARAM_FCEV_GAS = 256; - const int HYUNDAI_PARAM_ALT_LIMITS_2 = 512; - - hyundai_ev_gas_signal = GET_FLAG(param, HYUNDAI_PARAM_EV_GAS); - hyundai_hybrid_gas_signal = !hyundai_ev_gas_signal && GET_FLAG(param, HYUNDAI_PARAM_HYBRID_GAS); - hyundai_camera_scc = GET_FLAG(param, HYUNDAI_PARAM_CAMERA_SCC); - hyundai_canfd_lka_steering = GET_FLAG(param, HYUNDAI_PARAM_CANFD_LKA_STEERING); - hyundai_alt_limits = GET_FLAG(param, HYUNDAI_PARAM_ALT_LIMITS); - hyundai_fcev_gas_signal = GET_FLAG(param, HYUNDAI_PARAM_FCEV_GAS); - hyundai_alt_limits_2 = GET_FLAG(param, HYUNDAI_PARAM_ALT_LIMITS_2); - - hyundai_last_button_interaction = HYUNDAI_PREV_BUTTON_SAMPLES; - -#ifdef ALLOW_DEBUG - const int HYUNDAI_PARAM_LONGITUDINAL = 4; - hyundai_longitudinal = GET_FLAG(param, HYUNDAI_PARAM_LONGITUDINAL); -#else - hyundai_longitudinal = false; -#endif -} - -void hyundai_common_cruise_state_check(const bool cruise_engaged) { - // some newer HKG models can re-enable after spamming cancel button, - // so keep track of user button presses to deny engagement if no interaction - - // enter controls on rising edge of ACC and recent user button press, exit controls when ACC off - if (!hyundai_longitudinal) { - if (cruise_engaged && !cruise_engaged_prev && (hyundai_last_button_interaction < HYUNDAI_PREV_BUTTON_SAMPLES)) { - controls_allowed = true; - } - - if (!cruise_engaged) { - controls_allowed = false; - } - cruise_engaged_prev = cruise_engaged; - } -} - -void hyundai_common_cruise_buttons_check(const int cruise_button, const bool main_button) { - if ((cruise_button == HYUNDAI_BTN_RESUME) || (cruise_button == HYUNDAI_BTN_SET) || (cruise_button == HYUNDAI_BTN_CANCEL) || main_button) { - hyundai_last_button_interaction = 0U; - } else { - hyundai_last_button_interaction = MIN(hyundai_last_button_interaction + 1U, HYUNDAI_PREV_BUTTON_SAMPLES); - } - - if (hyundai_longitudinal) { - // enter controls on falling edge of resume or set - bool set = (cruise_button != HYUNDAI_BTN_SET) && (cruise_button_prev == HYUNDAI_BTN_SET); - bool res = (cruise_button != HYUNDAI_BTN_RESUME) && (cruise_button_prev == HYUNDAI_BTN_RESUME); - if (set || res) { - controls_allowed = true; - } - - // exit controls on cancel press - if (cruise_button == HYUNDAI_BTN_CANCEL) { - controls_allowed = false; - } - - cruise_button_prev = cruise_button; - } -} - -uint32_t hyundai_common_canfd_compute_checksum(const CANPacket_t *to_push) { - int len = GET_LEN(to_push); - uint32_t address = GET_ADDR(to_push); - - uint16_t crc = 0; - - for (int i = 2; i < len; i++) { - crc = (crc << 8U) ^ hyundai_canfd_crc_lut[(crc >> 8U) ^ GET_BYTE(to_push, i)]; - } - - // Add address to crc - crc = (crc << 8U) ^ hyundai_canfd_crc_lut[(crc >> 8U) ^ ((address >> 0U) & 0xFFU)]; - crc = (crc << 8U) ^ hyundai_canfd_crc_lut[(crc >> 8U) ^ ((address >> 8U) & 0xFFU)]; - - if (len == 24) { - crc ^= 0x819dU; - } else if (len == 32) { - crc ^= 0x9f5bU; - } else { - - } - - return crc; -} diff --git a/opendbc/safety/safety/safety_mazda.h b/opendbc/safety/safety/safety_mazda.h deleted file mode 100644 index 7a1e4bdda16..00000000000 --- a/opendbc/safety/safety/safety_mazda.h +++ /dev/null @@ -1,131 +0,0 @@ -#pragma once - -#include "safety_declarations.h" - -// CAN msgs we care about -#define MAZDA_LKAS 0x243 -#define MAZDA_LKAS_HUD 0x440 -#define MAZDA_CRZ_CTRL 0x21c -#define MAZDA_CRZ_BTNS 0x09d -#define MAZDA_STEER_TORQUE 0x240 -#define MAZDA_ENGINE_DATA 0x202 -#define MAZDA_PEDALS 0x165 - -// CAN bus numbers -#define MAZDA_MAIN 0 -#define MAZDA_CAM 2 - -// track msgs coming from OP so that we know what CAM msgs to drop and what to forward -static void mazda_rx_hook(const CANPacket_t *to_push) { - if ((int)GET_BUS(to_push) == MAZDA_MAIN) { - int addr = GET_ADDR(to_push); - - if (addr == MAZDA_ENGINE_DATA) { - // sample speed: scale by 0.01 to get kph - int speed = (GET_BYTE(to_push, 2) << 8) | GET_BYTE(to_push, 3); - vehicle_moving = speed > 10; // moving when speed > 0.1 kph - } - - if (addr == MAZDA_STEER_TORQUE) { - int torque_driver_new = GET_BYTE(to_push, 0) - 127U; - // update array of samples - update_sample(&torque_driver, torque_driver_new); - } - - // enter controls on rising edge of ACC, exit controls on ACC off - if (addr == MAZDA_CRZ_CTRL) { - bool cruise_engaged = GET_BYTE(to_push, 0) & 0x8U; - pcm_cruise_check(cruise_engaged); - } - - if (addr == MAZDA_ENGINE_DATA) { - gas_pressed = (GET_BYTE(to_push, 4) || (GET_BYTE(to_push, 5) & 0xF0U)); - } - - if (addr == MAZDA_PEDALS) { - brake_pressed = (GET_BYTE(to_push, 0) & 0x10U); - } - - generic_rx_checks((addr == MAZDA_LKAS)); - } -} - -static bool mazda_tx_hook(const CANPacket_t *to_send) { - const TorqueSteeringLimits MAZDA_STEERING_LIMITS = { - .max_steer = 800, - .max_rate_up = 10, - .max_rate_down = 25, - .max_rt_delta = 300, - .max_rt_interval = 250000, - .driver_torque_multiplier = 1, - .driver_torque_allowance = 15, - .type = TorqueDriverLimited, - }; - - bool tx = true; - int bus = GET_BUS(to_send); - // Check if msg is sent on the main BUS - if (bus == MAZDA_MAIN) { - int addr = GET_ADDR(to_send); - - // steer cmd checks - if (addr == MAZDA_LKAS) { - int desired_torque = (((GET_BYTE(to_send, 0) & 0x0FU) << 8) | GET_BYTE(to_send, 1)) - 2048U; - - if (steer_torque_cmd_checks(desired_torque, -1, MAZDA_STEERING_LIMITS)) { - tx = false; - } - } - - // cruise buttons check - if (addr == MAZDA_CRZ_BTNS) { - // allow resume spamming while controls allowed, but - // only allow cancel while contrls not allowed - bool cancel_cmd = (GET_BYTE(to_send, 0) == 0x1U); - if (!controls_allowed && !cancel_cmd) { - tx = false; - } - } - } - - return tx; -} - -static int mazda_fwd_hook(int bus, int addr) { - int bus_fwd = -1; - - if (bus == MAZDA_MAIN) { - bus_fwd = MAZDA_CAM; - } else if (bus == MAZDA_CAM) { - bool block = (addr == MAZDA_LKAS) || (addr == MAZDA_LKAS_HUD); - if (!block) { - bus_fwd = MAZDA_MAIN; - } - } else { - // don't fwd - } - - return bus_fwd; -} - -static safety_config mazda_init(uint16_t param) { - static const CanMsg MAZDA_TX_MSGS[] = {{MAZDA_LKAS, 0, 8}, {MAZDA_CRZ_BTNS, 0, 8}, {MAZDA_LKAS_HUD, 0, 8}}; - - static RxCheck mazda_rx_checks[] = { - {.msg = {{MAZDA_CRZ_CTRL, 0, 8, .ignore_checksum = true, .ignore_counter = true, .frequency = 50U}, { 0 }, { 0 }}}, - {.msg = {{MAZDA_CRZ_BTNS, 0, 8, .ignore_checksum = true, .ignore_counter = true, .frequency = 10U}, { 0 }, { 0 }}}, - {.msg = {{MAZDA_STEER_TORQUE, 0, 8, .ignore_checksum = true, .ignore_counter = true, .frequency = 83U}, { 0 }, { 0 }}}, - {.msg = {{MAZDA_ENGINE_DATA, 0, 8, .ignore_checksum = true, .ignore_counter = true, .frequency = 100U}, { 0 }, { 0 }}}, - {.msg = {{MAZDA_PEDALS, 0, 8, .ignore_checksum = true, .ignore_counter = true, .frequency = 50U}, { 0 }, { 0 }}}, - }; - - UNUSED(param); - return BUILD_SAFETY_CFG(mazda_rx_checks, MAZDA_TX_MSGS); -} - -const safety_hooks mazda_hooks = { - .init = mazda_init, - .rx = mazda_rx_hook, - .tx = mazda_tx_hook, - .fwd = mazda_fwd_hook, -}; diff --git a/opendbc/safety/safety/safety_nissan.h b/opendbc/safety/safety/safety_nissan.h deleted file mode 100644 index 78a051df187..00000000000 --- a/opendbc/safety/safety/safety_nissan.h +++ /dev/null @@ -1,164 +0,0 @@ -#pragma once - -#include "safety_declarations.h" - -static bool nissan_alt_eps = false; - -static void nissan_rx_hook(const CANPacket_t *to_push) { - int bus = GET_BUS(to_push); - int addr = GET_ADDR(to_push); - - if (bus == (nissan_alt_eps ? 1 : 0)) { - if (addr == 0x2) { - // Current steering angle - // Factor -0.1, little endian - int angle_meas_new = (GET_BYTES(to_push, 0, 4) & 0xFFFFU); - // Multiply by -10 to match scale of LKAS angle - angle_meas_new = to_signed(angle_meas_new, 16) * -10; - - // update array of samples - update_sample(&angle_meas, angle_meas_new); - } - - if (addr == 0x285) { - // Get current speed and standstill - uint16_t right_rear = (GET_BYTE(to_push, 0) << 8) | (GET_BYTE(to_push, 1)); - uint16_t left_rear = (GET_BYTE(to_push, 2) << 8) | (GET_BYTE(to_push, 3)); - vehicle_moving = (right_rear | left_rear) != 0U; - UPDATE_VEHICLE_SPEED((right_rear + left_rear) / 2.0 * 0.005 / 3.6); - } - - // X-Trail 0x15c, Leaf 0x239 - if ((addr == 0x15c) || (addr == 0x239)) { - if (addr == 0x15c){ - gas_pressed = ((GET_BYTE(to_push, 5) << 2) | ((GET_BYTE(to_push, 6) >> 6) & 0x3U)) > 3U; - } else { - gas_pressed = GET_BYTE(to_push, 0) > 3U; - } - } - - // X-trail 0x454, Leaf 0x239 - if ((addr == 0x454) || (addr == 0x239)) { - if (addr == 0x454){ - brake_pressed = (GET_BYTE(to_push, 2) & 0x80U) != 0U; - } else { - brake_pressed = ((GET_BYTE(to_push, 4) >> 5) & 1U) != 0U; - } - } - } - - // Handle cruise enabled - if ((addr == 0x30f) && (bus == (nissan_alt_eps ? 1 : 2))) { - bool cruise_engaged = (GET_BYTE(to_push, 0) >> 3) & 1U; - pcm_cruise_check(cruise_engaged); - } - - generic_rx_checks((addr == 0x169) && (bus == 0)); -} - - -static bool nissan_tx_hook(const CANPacket_t *to_send) { - const AngleSteeringLimits NISSAN_STEERING_LIMITS = { - .max_angle = 60000, // 600 deg, reasonable limit - .angle_deg_to_can = 100, - .angle_rate_up_lookup = { - {0., 5., 15.}, - {5., .8, .15} - }, - .angle_rate_down_lookup = { - {0., 5., 15.}, - {5., 3.5, .4} - }, - }; - - bool tx = true; - int addr = GET_ADDR(to_send); - bool violation = false; - - // steer cmd checks - if (addr == 0x169) { - int desired_angle = ((GET_BYTE(to_send, 0) << 10) | (GET_BYTE(to_send, 1) << 2) | ((GET_BYTE(to_send, 2) >> 6) & 0x3U)); - bool lka_active = (GET_BYTE(to_send, 6) >> 4) & 1U; - - // Factor is -0.01, offset is 1310. Flip to correct sign, but keep units in CAN scale - desired_angle = -desired_angle + (1310.0f * NISSAN_STEERING_LIMITS.angle_deg_to_can); - - if (steer_angle_cmd_checks(desired_angle, lka_active, NISSAN_STEERING_LIMITS)) { - violation = true; - } - } - - // acc button check, only allow cancel button to be sent - if (addr == 0x20b) { - // Violation of any button other than cancel is pressed - violation |= ((GET_BYTE(to_send, 1) & 0x3dU) > 0U); - } - - if (violation) { - tx = false; - } - - return tx; -} - - -static int nissan_fwd_hook(int bus_num, int addr) { - int bus_fwd = -1; - - if (bus_num == 0) { - bool block_msg = (addr == 0x280); // CANCEL_MSG - if (!block_msg) { - bus_fwd = 2; // ADAS - } - } - - if (bus_num == 2) { - // 0x169 is LKAS, 0x2b1 LKAS_HUD, 0x4cc LKAS_HUD_INFO_MSG - bool block_msg = ((addr == 0x169) || (addr == 0x2b1) || (addr == 0x4cc)); - if (!block_msg) { - bus_fwd = 0; // V-CAN - } - } - - return bus_fwd; -} - -static safety_config nissan_init(uint16_t param) { - static const CanMsg NISSAN_TX_MSGS[] = { - {0x169, 0, 8}, // LKAS - {0x2b1, 0, 8}, // PROPILOT_HUD - {0x4cc, 0, 8}, // PROPILOT_HUD_INFO_MSG - {0x20b, 2, 6}, // CRUISE_THROTTLE (X-Trail) - {0x20b, 1, 6}, // CRUISE_THROTTLE (Altima) - {0x280, 2, 8} // CANCEL_MSG (Leaf) - }; - - // Signals duplicated below due to the fact that these messages can come in on either CAN bus, depending on car model. - static RxCheck nissan_rx_checks[] = { - {.msg = {{0x2, 0, 5, .ignore_checksum = true, .ignore_counter = true, .frequency = 100U}, - {0x2, 1, 5, .ignore_checksum = true, .ignore_counter = true, .frequency = 100U}, { 0 }}}, // STEER_ANGLE_SENSOR - {.msg = {{0x285, 0, 8, .ignore_checksum = true, .ignore_counter = true, .frequency = 50U}, - {0x285, 1, 8, .ignore_checksum = true, .ignore_counter = true, .frequency = 50U}, { 0 }}}, // WHEEL_SPEEDS_REAR - {.msg = {{0x30f, 2, 3, .ignore_checksum = true, .ignore_counter = true, .frequency = 10U}, - {0x30f, 1, 3, .ignore_checksum = true, .ignore_counter = true, .frequency = 10U}, { 0 }}}, // CRUISE_STATE - {.msg = {{0x15c, 0, 8, .ignore_checksum = true, .ignore_counter = true, .frequency = 50U}, - {0x15c, 1, 8, .ignore_checksum = true, .ignore_counter = true, .frequency = 50U}, - {0x239, 0, 8, .ignore_checksum = true, .ignore_counter = true, .frequency = 50U}}}, // GAS_PEDAL - {.msg = {{0x454, 0, 8, .ignore_checksum = true, .ignore_counter = true, .frequency = 10U}, - {0x454, 1, 8, .ignore_checksum = true, .ignore_counter = true, .frequency = 10U}, - {0x1cc, 0, 4, .ignore_checksum = true, .ignore_counter = true, .frequency = 100U}}}, // DOORS_LIGHTS / BRAKE - }; - - // EPS Location. false = V-CAN, true = C-CAN - const int NISSAN_PARAM_ALT_EPS_BUS = 1; - - nissan_alt_eps = GET_FLAG(param, NISSAN_PARAM_ALT_EPS_BUS); - return BUILD_SAFETY_CFG(nissan_rx_checks, NISSAN_TX_MSGS); -} - -const safety_hooks nissan_hooks = { - .init = nissan_init, - .rx = nissan_rx_hook, - .tx = nissan_tx_hook, - .fwd = nissan_fwd_hook, -}; diff --git a/opendbc/safety/safety/safety_rivian.h b/opendbc/safety/safety/safety_rivian.h deleted file mode 100644 index 9f1f908b853..00000000000 --- a/opendbc/safety/safety/safety_rivian.h +++ /dev/null @@ -1,162 +0,0 @@ -#pragma once - -#include "safety_declarations.h" - -static bool rivian_longitudinal = false; - -static void rivian_rx_hook(const CANPacket_t *to_push) { - int bus = GET_BUS(to_push); - int addr = GET_ADDR(to_push); - - if (bus == 0) { - // Vehicle speed - if (addr == 0x208) { - vehicle_moving = GET_BYTE(to_push, 6) | GET_BYTE(to_push, 7); - } - - // Driver torque - if (addr == 0x380) { - int torque_driver_new = (((GET_BYTE(to_push, 2) << 4) | (GET_BYTE(to_push, 3) >> 4))) - 2050U; - update_sample(&torque_driver, torque_driver_new); - } - - // Gas pressed - if (addr == 0x150) { - gas_pressed = GET_BYTE(to_push, 3) | (GET_BYTE(to_push, 4) & 0xC0U); - } - - // Brake pressed - if (addr == 0x38f) { - brake_pressed = GET_BIT(to_push, 23U); - } - - generic_rx_checks(addr == 0x120); // ACM_lkaHbaCmd - if (rivian_longitudinal) { - generic_rx_checks(addr == 0x160); // ACM_longitudinalRequest - } - } - - if (bus == 2) { - // Cruise state - if (addr == 0x100) { - const int feature_status = GET_BYTE(to_push, 2) >> 5U; - pcm_cruise_check(feature_status == 1); - } - } -} - -static bool rivian_tx_hook(const CANPacket_t *to_send) { - const TorqueSteeringLimits RIVIAN_STEERING_LIMITS = { - .max_steer = 250, - .max_rate_up = 3, - .max_rate_down = 5, - .max_rt_delta = 125, - .max_rt_interval = 250000, - .driver_torque_multiplier = 2, - .driver_torque_allowance = 100, - .type = TorqueDriverLimited, - }; - - const LongitudinalLimits RIVIAN_LONG_LIMITS = { - .max_accel = 200, - .min_accel = -350, - .inactive_accel = 0, - }; - - bool tx = true; - int bus = GET_BUS(to_send); - - if (bus == 0) { - int addr = GET_ADDR(to_send); - - // Steering control - if (addr == 0x120) { - int desired_torque = ((GET_BYTE(to_send, 2) << 3U) | (GET_BYTE(to_send, 3) >> 5U)) - 1024U; - bool steer_req = GET_BIT(to_send, 28U); - - if (steer_torque_cmd_checks(desired_torque, steer_req, RIVIAN_STEERING_LIMITS)) { - tx = false; - } - } - - // Longitudinal control - if (addr == 0x160) { - int raw_accel = ((GET_BYTE(to_send, 2) << 3) | (GET_BYTE(to_send, 3) >> 5)) - 1024U; - if (longitudinal_accel_checks(raw_accel, RIVIAN_LONG_LIMITS)) { - tx = false; - } - } - } - - return tx; -} - -static int rivian_fwd_hook(int bus, int addr) { - int bus_fwd = -1; - bool block_msg = false; - - if (bus == 0) { - // SCCM_WheelTouch: for hiding hold wheel alert - if (addr == 0x321) { - block_msg = true; - } - - // VDM_AdasSts: for canceling stock ACC - if ((addr == 0x162) && !rivian_longitudinal) { - block_msg = true; - } - - if (!block_msg) { - bus_fwd = 2; - } - } - - if (bus == 2) { - // ACM_lkaHbaCmd: lateral control message - if (addr == 0x120) { - block_msg = true; - } - - // ACM_longitudinalRequest: longitudinal control message - if (rivian_longitudinal && (addr == 0x160)) { - block_msg = true; - } - - if (!block_msg) { - bus_fwd = 0; - } - } - - return bus_fwd; -} - -static safety_config rivian_init(uint16_t param) { - // 0x120 = ACM_lkaHbaCmd, 0x321 = SCCM_WheelTouch, 0x162 = VDM_AdasSts - static const CanMsg RIVIAN_TX_MSGS[] = {{0x120, 0, 8}, {0x321, 2, 7}, {0x162, 2, 8}}; - // 0x160 = ACM_longitudinalRequest - static const CanMsg RIVIAN_LONG_TX_MSGS[] = {{0x120, 0, 8}, {0x321, 2, 7}, {0x160, 0, 5}}; - - static RxCheck rivian_rx_checks[] = { - {.msg = {{0x208, 0, 8, .frequency = 50U, .ignore_checksum = true, .ignore_counter = true}, { 0 }, { 0 }}}, // ESP_Status (speed) - {.msg = {{0x380, 0, 5, .frequency = 100U, .ignore_checksum = true, .ignore_counter = true}, { 0 }, { 0 }}}, // EPAS_SystemStatus (driver torque) - {.msg = {{0x150, 0, 7, .frequency = 50U, .ignore_checksum = true, .ignore_counter = true}, { 0 }, { 0 }}}, // VDM_PropStatus (gas pedal) - {.msg = {{0x38f, 0, 6, .frequency = 50U, .ignore_checksum = true, .ignore_counter = true}, { 0 }, { 0 }}}, // iBESP2 (brakes) - {.msg = {{0x100, 2, 8, .frequency = 100U, .ignore_checksum = true, .ignore_counter = true}, { 0 }, { 0 }}}, // ACM_Status (cruise state) - }; - - UNUSED(param); - #ifdef ALLOW_DEBUG - const int FLAG_RIVIAN_LONG_CONTROL = 1; - rivian_longitudinal = GET_FLAG(param, FLAG_RIVIAN_LONG_CONTROL); - #endif - - return rivian_longitudinal ? BUILD_SAFETY_CFG(rivian_rx_checks, RIVIAN_LONG_TX_MSGS) : \ - BUILD_SAFETY_CFG(rivian_rx_checks, RIVIAN_TX_MSGS); -} - -const safety_hooks rivian_hooks = { - .init = rivian_init, - .rx = rivian_rx_hook, - .tx = rivian_tx_hook, - .fwd = rivian_fwd_hook, -}; diff --git a/opendbc/safety/safety/safety_subaru.h b/opendbc/safety/safety/safety_subaru.h deleted file mode 100644 index 3185270b1e1..00000000000 --- a/opendbc/safety/safety/safety_subaru.h +++ /dev/null @@ -1,293 +0,0 @@ -#pragma once - -#include "safety_declarations.h" - -#define SUBARU_STEERING_LIMITS_GENERATOR(steer_max, rate_up, rate_down) \ - { \ - .max_steer = (steer_max), \ - .max_rt_delta = 940, \ - .max_rt_interval = 250000, \ - .max_rate_up = (rate_up), \ - .max_rate_down = (rate_down), \ - .driver_torque_multiplier = 50, \ - .driver_torque_allowance = 60, \ - .type = TorqueDriverLimited, \ - /* the EPS will temporary fault if the steering rate is too high, so we cut the \ - the steering torque every 7 frames for 1 frame if the steering rate is high */ \ - .min_valid_request_frames = 7, \ - .max_invalid_request_frames = 1, \ - .min_valid_request_rt_interval = 144000, /* 10% tolerance */ \ - .has_steer_req_tolerance = true, \ - } - -#define MSG_SUBARU_Brake_Status 0x13c -#define MSG_SUBARU_CruiseControl 0x240 -#define MSG_SUBARU_Throttle 0x40 -#define MSG_SUBARU_Steering_Torque 0x119 -#define MSG_SUBARU_Wheel_Speeds 0x13a - -#define MSG_SUBARU_ES_LKAS 0x122 -#define MSG_SUBARU_ES_Brake 0x220 -#define MSG_SUBARU_ES_Distance 0x221 -#define MSG_SUBARU_ES_Status 0x222 -#define MSG_SUBARU_ES_DashStatus 0x321 -#define MSG_SUBARU_ES_LKAS_State 0x322 -#define MSG_SUBARU_ES_Infotainment 0x323 - -#define MSG_SUBARU_ES_UDS_Request 0x787 - -#define MSG_SUBARU_ES_HighBeamAssist 0x121 -#define MSG_SUBARU_ES_STATIC_1 0x22a -#define MSG_SUBARU_ES_STATIC_2 0x325 - -#define SUBARU_MAIN_BUS 0 -#define SUBARU_ALT_BUS 1 -#define SUBARU_CAM_BUS 2 - -#define SUBARU_COMMON_TX_MSGS(alt_bus, lkas_msg) \ - {lkas_msg, SUBARU_MAIN_BUS, 8}, \ - {MSG_SUBARU_ES_Distance, alt_bus, 8}, \ - {MSG_SUBARU_ES_DashStatus, SUBARU_MAIN_BUS, 8}, \ - {MSG_SUBARU_ES_LKAS_State, SUBARU_MAIN_BUS, 8}, \ - {MSG_SUBARU_ES_Infotainment, SUBARU_MAIN_BUS, 8}, \ - -#define SUBARU_COMMON_LONG_TX_MSGS(alt_bus) \ - {MSG_SUBARU_ES_Brake, alt_bus, 8}, \ - {MSG_SUBARU_ES_Status, alt_bus, 8}, \ - -#define SUBARU_GEN2_LONG_ADDITIONAL_TX_MSGS() \ - {MSG_SUBARU_ES_UDS_Request, SUBARU_CAM_BUS, 8}, \ - {MSG_SUBARU_ES_HighBeamAssist, SUBARU_MAIN_BUS, 8}, \ - {MSG_SUBARU_ES_STATIC_1, SUBARU_MAIN_BUS, 8}, \ - {MSG_SUBARU_ES_STATIC_2, SUBARU_MAIN_BUS, 8}, \ - -#define SUBARU_COMMON_RX_CHECKS(alt_bus) \ - {.msg = {{MSG_SUBARU_Throttle, SUBARU_MAIN_BUS, 8, .max_counter = 15U, .frequency = 100U}, { 0 }, { 0 }}}, \ - {.msg = {{MSG_SUBARU_Steering_Torque, SUBARU_MAIN_BUS, 8, .max_counter = 15U, .frequency = 50U}, { 0 }, { 0 }}}, \ - {.msg = {{MSG_SUBARU_Wheel_Speeds, alt_bus, 8, .max_counter = 15U, .frequency = 50U}, { 0 }, { 0 }}}, \ - {.msg = {{MSG_SUBARU_Brake_Status, alt_bus, 8, .max_counter = 15U, .frequency = 50U}, { 0 }, { 0 }}}, \ - {.msg = {{MSG_SUBARU_CruiseControl, alt_bus, 8, .max_counter = 15U, .frequency = 20U}, { 0 }, { 0 }}}, \ - -static bool subaru_gen2 = false; -static bool subaru_longitudinal = false; - -static uint32_t subaru_get_checksum(const CANPacket_t *to_push) { - return (uint8_t)GET_BYTE(to_push, 0); -} - -static uint8_t subaru_get_counter(const CANPacket_t *to_push) { - return (uint8_t)(GET_BYTE(to_push, 1) & 0xFU); -} - -static uint32_t subaru_compute_checksum(const CANPacket_t *to_push) { - int addr = GET_ADDR(to_push); - int len = GET_LEN(to_push); - uint8_t checksum = (uint8_t)(addr) + (uint8_t)((unsigned int)(addr) >> 8U); - for (int i = 1; i < len; i++) { - checksum += (uint8_t)GET_BYTE(to_push, i); - } - return checksum; -} - -static void subaru_rx_hook(const CANPacket_t *to_push) { - const int bus = GET_BUS(to_push); - const int alt_main_bus = subaru_gen2 ? SUBARU_ALT_BUS : SUBARU_MAIN_BUS; - - int addr = GET_ADDR(to_push); - if ((addr == MSG_SUBARU_Steering_Torque) && (bus == SUBARU_MAIN_BUS)) { - int torque_driver_new; - torque_driver_new = ((GET_BYTES(to_push, 0, 4) >> 16) & 0x7FFU); - torque_driver_new = -1 * to_signed(torque_driver_new, 11); - update_sample(&torque_driver, torque_driver_new); - - int angle_meas_new = (GET_BYTES(to_push, 4, 2) & 0xFFFFU); - // convert Steering_Torque -> Steering_Angle to centidegrees, to match the ES_LKAS_ANGLE angle request units - angle_meas_new = ROUND(to_signed(angle_meas_new, 16) * -2.17); - update_sample(&angle_meas, angle_meas_new); - } - - // enter controls on rising edge of ACC, exit controls on ACC off - if ((addr == MSG_SUBARU_CruiseControl) && (bus == alt_main_bus)) { - bool cruise_engaged = GET_BIT(to_push, 41U); - pcm_cruise_check(cruise_engaged); - } - - // update vehicle moving with any non-zero wheel speed - if ((addr == MSG_SUBARU_Wheel_Speeds) && (bus == alt_main_bus)) { - uint32_t fr = (GET_BYTES(to_push, 1, 3) >> 4) & 0x1FFFU; - uint32_t rr = (GET_BYTES(to_push, 3, 3) >> 1) & 0x1FFFU; - uint32_t rl = (GET_BYTES(to_push, 4, 3) >> 6) & 0x1FFFU; - uint32_t fl = (GET_BYTES(to_push, 6, 2) >> 3) & 0x1FFFU; - - vehicle_moving = (fr > 0U) || (rr > 0U) || (rl > 0U) || (fl > 0U); - - UPDATE_VEHICLE_SPEED((fr + rr + rl + fl) / 4.0 * 0.057 / 3.6); - } - - if ((addr == MSG_SUBARU_Brake_Status) && (bus == alt_main_bus)) { - brake_pressed = GET_BIT(to_push, 62U); - } - - if ((addr == MSG_SUBARU_Throttle) && (bus == SUBARU_MAIN_BUS)) { - gas_pressed = GET_BYTE(to_push, 4) != 0U; - } - - generic_rx_checks((addr == MSG_SUBARU_ES_LKAS) && (bus == SUBARU_MAIN_BUS)); -} - -static bool subaru_tx_hook(const CANPacket_t *to_send) { - const TorqueSteeringLimits SUBARU_STEERING_LIMITS = SUBARU_STEERING_LIMITS_GENERATOR(2047, 50, 70); - const TorqueSteeringLimits SUBARU_GEN2_STEERING_LIMITS = SUBARU_STEERING_LIMITS_GENERATOR(1000, 40, 40); - - const LongitudinalLimits SUBARU_LONG_LIMITS = { - .min_gas = 808, // appears to be engine braking - .max_gas = 3400, // approx 2 m/s^2 when maxing cruise_rpm and cruise_throttle - .inactive_gas = 1818, // this is zero acceleration - .max_brake = 600, // approx -3.5 m/s^2 - - .min_transmission_rpm = 0, - .max_transmission_rpm = 3600, - }; - - bool tx = true; - int addr = GET_ADDR(to_send); - bool violation = false; - - // steer cmd checks - if (addr == MSG_SUBARU_ES_LKAS) { - int desired_torque = ((GET_BYTES(to_send, 0, 4) >> 16) & 0x1FFFU); - desired_torque = -1 * to_signed(desired_torque, 13); - - bool steer_req = GET_BIT(to_send, 29U); - - const TorqueSteeringLimits limits = subaru_gen2 ? SUBARU_GEN2_STEERING_LIMITS : SUBARU_STEERING_LIMITS; - violation |= steer_torque_cmd_checks(desired_torque, steer_req, limits); - } - - // check es_brake brake_pressure limits - if (addr == MSG_SUBARU_ES_Brake) { - int es_brake_pressure = GET_BYTES(to_send, 2, 2); - violation |= longitudinal_brake_checks(es_brake_pressure, SUBARU_LONG_LIMITS); - } - - // check es_distance cruise_throttle limits - if (addr == MSG_SUBARU_ES_Distance) { - int cruise_throttle = (GET_BYTES(to_send, 2, 2) & 0x1FFFU); - bool cruise_cancel = GET_BIT(to_send, 56U); - - if (subaru_longitudinal) { - violation |= longitudinal_gas_checks(cruise_throttle, SUBARU_LONG_LIMITS); - } else { - // If openpilot is not controlling long, only allow ES_Distance for cruise cancel requests, - // (when Cruise_Cancel is true, and Cruise_Throttle is inactive) - violation |= (cruise_throttle != SUBARU_LONG_LIMITS.inactive_gas); - violation |= (!cruise_cancel); - } - } - - // check es_status transmission_rpm limits - if (addr == MSG_SUBARU_ES_Status) { - int transmission_rpm = (GET_BYTES(to_send, 2, 2) & 0x1FFFU); - violation |= longitudinal_transmission_rpm_checks(transmission_rpm, SUBARU_LONG_LIMITS); - } - - if (addr == MSG_SUBARU_ES_UDS_Request) { - // tester present ('\x02\x3E\x80\x00\x00\x00\x00\x00') is allowed for gen2 longitudinal to keep eyesight disabled - bool is_tester_present = (GET_BYTES(to_send, 0, 4) == 0x00803E02U) && (GET_BYTES(to_send, 4, 4) == 0x0U); - - // reading ES button data by identifier (b'\x03\x22\x11\x30\x00\x00\x00\x00') is also allowed (DID 0x1130) - bool is_button_rdbi = (GET_BYTES(to_send, 0, 4) == 0x30112203U) && (GET_BYTES(to_send, 4, 4) == 0x0U); - - violation |= !(is_tester_present || is_button_rdbi); - } - - if (violation){ - tx = false; - } - return tx; -} - -static int subaru_fwd_hook(int bus_num, int addr) { - int bus_fwd = -1; - - if (bus_num == SUBARU_MAIN_BUS) { - bus_fwd = SUBARU_CAM_BUS; // to the eyesight camera - } - - if (bus_num == SUBARU_CAM_BUS) { - // Global platform - bool block_lkas = ((addr == MSG_SUBARU_ES_LKAS) || - (addr == MSG_SUBARU_ES_DashStatus) || - (addr == MSG_SUBARU_ES_LKAS_State) || - (addr == MSG_SUBARU_ES_Infotainment)); - - bool block_long = ((addr == MSG_SUBARU_ES_Brake) || - (addr == MSG_SUBARU_ES_Distance) || - (addr == MSG_SUBARU_ES_Status)); - - bool block_msg = block_lkas || (subaru_longitudinal && block_long); - if (!block_msg) { - bus_fwd = SUBARU_MAIN_BUS; // Main CAN - } - } - - return bus_fwd; -} - -static safety_config subaru_init(uint16_t param) { - static const CanMsg SUBARU_TX_MSGS[] = { - SUBARU_COMMON_TX_MSGS(SUBARU_MAIN_BUS, MSG_SUBARU_ES_LKAS) - }; - - static const CanMsg SUBARU_LONG_TX_MSGS[] = { - SUBARU_COMMON_TX_MSGS(SUBARU_MAIN_BUS, MSG_SUBARU_ES_LKAS) - SUBARU_COMMON_LONG_TX_MSGS(SUBARU_MAIN_BUS) - }; - - static const CanMsg SUBARU_GEN2_TX_MSGS[] = { - SUBARU_COMMON_TX_MSGS(SUBARU_ALT_BUS, MSG_SUBARU_ES_LKAS) - }; - - static const CanMsg SUBARU_GEN2_LONG_TX_MSGS[] = { - SUBARU_COMMON_TX_MSGS(SUBARU_ALT_BUS, MSG_SUBARU_ES_LKAS) - SUBARU_COMMON_LONG_TX_MSGS(SUBARU_ALT_BUS) - SUBARU_GEN2_LONG_ADDITIONAL_TX_MSGS() - }; - - static RxCheck subaru_rx_checks[] = { - SUBARU_COMMON_RX_CHECKS(SUBARU_MAIN_BUS) - }; - - static RxCheck subaru_gen2_rx_checks[] = { - SUBARU_COMMON_RX_CHECKS(SUBARU_ALT_BUS) - }; - - const uint16_t SUBARU_PARAM_GEN2 = 1; - - subaru_gen2 = GET_FLAG(param, SUBARU_PARAM_GEN2); - -#ifdef ALLOW_DEBUG - const uint16_t SUBARU_PARAM_LONGITUDINAL = 2; - subaru_longitudinal = GET_FLAG(param, SUBARU_PARAM_LONGITUDINAL); -#endif - - safety_config ret; - if (subaru_gen2) { - ret = subaru_longitudinal ? BUILD_SAFETY_CFG(subaru_gen2_rx_checks, SUBARU_GEN2_LONG_TX_MSGS) : \ - BUILD_SAFETY_CFG(subaru_gen2_rx_checks, SUBARU_GEN2_TX_MSGS); - } else { - ret = subaru_longitudinal ? BUILD_SAFETY_CFG(subaru_rx_checks, SUBARU_LONG_TX_MSGS) : \ - BUILD_SAFETY_CFG(subaru_rx_checks, SUBARU_TX_MSGS); - } - return ret; -} - -const safety_hooks subaru_hooks = { - .init = subaru_init, - .rx = subaru_rx_hook, - .tx = subaru_tx_hook, - .fwd = subaru_fwd_hook, - .get_counter = subaru_get_counter, - .get_checksum = subaru_get_checksum, - .compute_checksum = subaru_compute_checksum, -}; diff --git a/opendbc/safety/safety/safety_subaru_preglobal.h b/opendbc/safety/safety/safety_subaru_preglobal.h deleted file mode 100644 index da5bbb82ece..00000000000 --- a/opendbc/safety/safety/safety_subaru_preglobal.h +++ /dev/null @@ -1,129 +0,0 @@ -#pragma once - -#include "safety_declarations.h" - -// Preglobal platform -// 0x161 is ES_CruiseThrottle -// 0x164 is ES_LKAS - -#define MSG_SUBARU_PG_CruiseControl 0x144 -#define MSG_SUBARU_PG_Throttle 0x140 -#define MSG_SUBARU_PG_Wheel_Speeds 0xD4 -#define MSG_SUBARU_PG_Brake_Pedal 0xD1 -#define MSG_SUBARU_PG_ES_LKAS 0x164 -#define MSG_SUBARU_PG_ES_Distance 0x161 -#define MSG_SUBARU_PG_Steering_Torque 0x371 - -#define SUBARU_PG_MAIN_BUS 0 -#define SUBARU_PG_CAM_BUS 2 - -static bool subaru_pg_reversed_driver_torque = false; - -static void subaru_preglobal_rx_hook(const CANPacket_t *to_push) { - const int bus = GET_BUS(to_push); - - if (bus == SUBARU_PG_MAIN_BUS) { - int addr = GET_ADDR(to_push); - if (addr == MSG_SUBARU_PG_Steering_Torque) { - int torque_driver_new; - torque_driver_new = (GET_BYTE(to_push, 3) >> 5) + (GET_BYTE(to_push, 4) << 3); - torque_driver_new = to_signed(torque_driver_new, 11); - torque_driver_new = subaru_pg_reversed_driver_torque ? -torque_driver_new : torque_driver_new; - update_sample(&torque_driver, torque_driver_new); - } - - // enter controls on rising edge of ACC, exit controls on ACC off - if (addr == MSG_SUBARU_PG_CruiseControl) { - bool cruise_engaged = GET_BIT(to_push, 49U); - pcm_cruise_check(cruise_engaged); - } - - // update vehicle moving with any non-zero wheel speed - if (addr == MSG_SUBARU_PG_Wheel_Speeds) { - vehicle_moving = ((GET_BYTES(to_push, 0, 4) >> 12) != 0U) || (GET_BYTES(to_push, 4, 4) != 0U); - } - - if (addr == MSG_SUBARU_PG_Brake_Pedal) { - brake_pressed = ((GET_BYTES(to_push, 0, 4) >> 16) & 0xFFU) > 0U; - } - - if (addr == MSG_SUBARU_PG_Throttle) { - gas_pressed = GET_BYTE(to_push, 0) != 0U; - } - - generic_rx_checks((addr == MSG_SUBARU_PG_ES_LKAS)); - } -} - -static bool subaru_preglobal_tx_hook(const CANPacket_t *to_send) { - const TorqueSteeringLimits SUBARU_PG_STEERING_LIMITS = { - .max_steer = 2047, - .max_rt_delta = 940, - .max_rt_interval = 250000, - .max_rate_up = 50, - .max_rate_down = 70, - .driver_torque_multiplier = 10, - .driver_torque_allowance = 75, - .type = TorqueDriverLimited, - }; - - bool tx = true; - int addr = GET_ADDR(to_send); - - // steer cmd checks - if (addr == MSG_SUBARU_PG_ES_LKAS) { - int desired_torque = ((GET_BYTES(to_send, 0, 4) >> 8) & 0x1FFFU); - desired_torque = -1 * to_signed(desired_torque, 13); - - bool steer_req = GET_BIT(to_send, 24U); - - if (steer_torque_cmd_checks(desired_torque, steer_req, SUBARU_PG_STEERING_LIMITS)) { - tx = false; - } - - } - return tx; -} - -static int subaru_preglobal_fwd_hook(int bus_num, int addr) { - int bus_fwd = -1; - - if (bus_num == SUBARU_PG_MAIN_BUS) { - bus_fwd = SUBARU_PG_CAM_BUS; // Camera CAN - } - - if (bus_num == SUBARU_PG_CAM_BUS) { - bool block_msg = ((addr == MSG_SUBARU_PG_ES_Distance) || (addr == MSG_SUBARU_PG_ES_LKAS)); - if (!block_msg) { - bus_fwd = SUBARU_PG_MAIN_BUS; // Main CAN - } - } - - return bus_fwd; -} - -static safety_config subaru_preglobal_init(uint16_t param) { - static const CanMsg SUBARU_PG_TX_MSGS[] = { - {MSG_SUBARU_PG_ES_Distance, SUBARU_PG_MAIN_BUS, 8}, - {MSG_SUBARU_PG_ES_LKAS, SUBARU_PG_MAIN_BUS, 8} - }; - - // TODO: do checksum and counter checks after adding the signals to the outback dbc file - static RxCheck subaru_preglobal_rx_checks[] = { - {.msg = {{MSG_SUBARU_PG_Throttle, SUBARU_PG_MAIN_BUS, 8, .ignore_checksum = true, .ignore_counter = true, .frequency = 100U}, { 0 }, { 0 }}}, - {.msg = {{MSG_SUBARU_PG_Steering_Torque, SUBARU_PG_MAIN_BUS, 8, .ignore_checksum = true, .ignore_counter = true, .frequency = 50U}, { 0 }, { 0 }}}, - {.msg = {{MSG_SUBARU_PG_CruiseControl, SUBARU_PG_MAIN_BUS, 8, .ignore_checksum = true, .ignore_counter = true, .frequency = 20U}, { 0 }, { 0 }}}, - }; - - const int SUBARU_PG_PARAM_REVERSED_DRIVER_TORQUE = 4; - - subaru_pg_reversed_driver_torque = GET_FLAG(param, SUBARU_PG_PARAM_REVERSED_DRIVER_TORQUE); - return BUILD_SAFETY_CFG(subaru_preglobal_rx_checks, SUBARU_PG_TX_MSGS); -} - -const safety_hooks subaru_preglobal_hooks = { - .init = subaru_preglobal_init, - .rx = subaru_preglobal_rx_hook, - .tx = subaru_preglobal_tx_hook, - .fwd = subaru_preglobal_fwd_hook, -}; diff --git a/opendbc/safety/safety/safety_tesla.h b/opendbc/safety/safety/safety_tesla.h deleted file mode 100644 index 611a4edeb43..00000000000 --- a/opendbc/safety/safety/safety_tesla.h +++ /dev/null @@ -1,214 +0,0 @@ -#pragma once - -#include "safety_declarations.h" - -static bool tesla_longitudinal = false; -static bool tesla_stock_aeb = false; - -static void tesla_rx_hook(const CANPacket_t *to_push) { - int bus = GET_BUS(to_push); - int addr = GET_ADDR(to_push); - - if (bus == 0) { - // Steering angle: (0.1 * val) - 819.2 in deg. - if (addr == 0x370) { - // Store it 1/10 deg to match steering request - int angle_meas_new = (((GET_BYTE(to_push, 4) & 0x3FU) << 8) | GET_BYTE(to_push, 5)) - 8192U; - update_sample(&angle_meas, angle_meas_new); - } - - // Vehicle speed - if (addr == 0x257) { - // Vehicle speed: ((val * 0.08) - 40) / MS_TO_KPH - float speed = ((((GET_BYTE(to_push, 2) << 4) | (GET_BYTE(to_push, 1) >> 4)) * 0.08) - 40) / 3.6; - UPDATE_VEHICLE_SPEED(speed); - } - - // Gas pressed - if (addr == 0x118) { - gas_pressed = (GET_BYTE(to_push, 4) != 0U); - } - - // Brake pressed - if (addr == 0x39d) { - brake_pressed = (GET_BYTE(to_push, 2) & 0x03U) == 2U; - } - - // Cruise state - if (addr == 0x286) { - int cruise_state = (GET_BYTE(to_push, 1) >> 4) & 0x07U; - bool cruise_engaged = (cruise_state == 2) || // ENABLED - (cruise_state == 3) || // STANDSTILL - (cruise_state == 4) || // OVERRIDE - (cruise_state == 6) || // PRE_FAULT - (cruise_state == 7); // PRE_CANCEL - - vehicle_moving = cruise_state != 3; // STANDSTILL - pcm_cruise_check(cruise_engaged); - } - } - - if (bus == 2) { - if (tesla_longitudinal && (addr == 0x2b9)) { - // "AEB_ACTIVE" - tesla_stock_aeb = (GET_BYTE(to_push, 2) & 0x03U) == 1U; - } - } - - generic_rx_checks((addr == 0x488) && (bus == 0)); // DAS_steeringControl - generic_rx_checks((addr == 0x27d) && (bus == 0)); // APS_eacMonitor - - if (tesla_longitudinal) { - generic_rx_checks((addr == 0x2b9) && (bus == 0)); - } -} - - -static bool tesla_tx_hook(const CANPacket_t *to_send) { - const AngleSteeringLimits TESLA_STEERING_LIMITS = { - .max_angle = 3600, // 360 deg, EPAS faults above this - .angle_deg_to_can = 10, - .angle_rate_up_lookup = { - {0., 5., 25.}, - {2.5, 1.5, 0.2} - }, - .angle_rate_down_lookup = { - {0., 5., 25.}, - {5., 2.0, 0.3} - }, - }; - - const LongitudinalLimits TESLA_LONG_LIMITS = { - .max_accel = 425, // 2 m/s^2 - .min_accel = 288, // -3.48 m/s^2 - .inactive_accel = 375, // 0. m/s^2 - }; - - bool tx = true; - int addr = GET_ADDR(to_send); - bool violation = false; - - // Steering control: (0.1 * val) - 1638.35 in deg. - if (addr == 0x488) { - // We use 1/10 deg as a unit here - int raw_angle_can = ((GET_BYTE(to_send, 0) & 0x7FU) << 8) | GET_BYTE(to_send, 1); - int desired_angle = raw_angle_can - 16384; - int steer_control_type = GET_BYTE(to_send, 2) >> 6; - bool steer_control_enabled = (steer_control_type != 0) && // NONE - (steer_control_type != 3); // DISABLED - - if (steer_angle_cmd_checks(desired_angle, steer_control_enabled, TESLA_STEERING_LIMITS)) { - violation = true; - } - } - - // DAS_control: longitudinal control message - if (addr == 0x2b9) { - // No AEB events may be sent by openpilot - int aeb_event = GET_BYTE(to_send, 2) & 0x03U; - if (aeb_event != 0) { - violation = true; - } - - int raw_accel_max = ((GET_BYTE(to_send, 6) & 0x1FU) << 4) | (GET_BYTE(to_send, 5) >> 4); - int raw_accel_min = ((GET_BYTE(to_send, 5) & 0x0FU) << 5) | (GET_BYTE(to_send, 4) >> 3); - int acc_state = GET_BYTE(to_send, 1) >> 4; - - if (tesla_longitudinal) { - // Don't send messages when the stock AEB system is active - if (tesla_stock_aeb) { - violation = true; - } - - // Prevent both acceleration from being negative, as this could cause the car to reverse after coming to standstill - if ((raw_accel_max < TESLA_LONG_LIMITS.inactive_accel) && (raw_accel_min < TESLA_LONG_LIMITS.inactive_accel)) { - violation = true; - } - - // Don't allow any acceleration limits above the safety limits - violation |= longitudinal_accel_checks(raw_accel_max, TESLA_LONG_LIMITS); - violation |= longitudinal_accel_checks(raw_accel_min, TESLA_LONG_LIMITS); - } else { - // does allowing cancel here disrupt stock AEB? TODO: find out and add safety or remove comment - // Can only send cancel longitudinal messages when not controlling longitudinal - if (acc_state != 13) { // ACC_CANCEL_GENERIC_SILENT - violation = true; - } - - // No actuation is allowed when not controlling longitudinal - if ((raw_accel_max != TESLA_LONG_LIMITS.inactive_accel) || (raw_accel_min != TESLA_LONG_LIMITS.inactive_accel)) { - violation = true; - } - } - } - - if (violation) { - tx = false; - } - - return tx; -} - -static int tesla_fwd_hook(int bus_num, int addr) { - int bus_fwd = -1; - - if (bus_num == 0) { - // Party to autopilot - bus_fwd = 2; - } - - if (bus_num == 2) { - bool block_msg = false; - // DAS_steeringControl, APS_eacMonitor - if ((addr == 0x488) || (addr == 0x27d)) { - block_msg = true; - } - - // DAS_control - if (tesla_longitudinal && (addr == 0x2b9) && !tesla_stock_aeb) { - block_msg = true; - } - - if (!block_msg) { - bus_fwd = 0; - } - } - - return bus_fwd; -} - -static safety_config tesla_init(uint16_t param) { - - static const CanMsg TESLA_M3_Y_TX_MSGS[] = { - {0x488, 0, 4}, // DAS_steeringControl - {0x2b9, 0, 8}, // DAS_control - {0x27D, 0, 3}, // APS_eacMonitor - }; - - UNUSED(param); -#ifdef ALLOW_DEBUG - const int TESLA_FLAG_LONGITUDINAL_CONTROL = 1; - tesla_longitudinal = GET_FLAG(param, TESLA_FLAG_LONGITUDINAL_CONTROL); -#endif - - tesla_stock_aeb = false; - - static RxCheck tesla_model3_y_rx_checks[] = { - {.msg = {{0x2b9, 2, 8, .ignore_checksum = true, .ignore_counter = true,.frequency = 25U}, { 0 }, { 0 }}}, // DAS_control - {.msg = {{0x257, 0, 8, .ignore_checksum = true, .ignore_counter = true,.frequency = 50U}, { 0 }, { 0 }}}, // DI_speed (speed in kph) - {.msg = {{0x370, 0, 8, .ignore_checksum = true, .ignore_counter = true,.frequency = 100U}, { 0 }, { 0 }}}, // EPAS3S_internalSAS (steering angle) - {.msg = {{0x118, 0, 8, .ignore_checksum = true, .ignore_counter = true,.frequency = 100U}, { 0 }, { 0 }}}, // DI_systemStatus (gas pedal) - {.msg = {{0x39d, 0, 5, .ignore_checksum = true, .ignore_counter = true,.frequency = 25U}, { 0 }, { 0 }}}, // IBST_status (brakes) - {.msg = {{0x286, 0, 8, .ignore_checksum = true, .ignore_counter = true,.frequency = 10U}, { 0 }, { 0 }}}, // DI_state (acc state) - {.msg = {{0x311, 0, 7, .ignore_checksum = true, .ignore_counter = true,.frequency = 10U}, { 0 }, { 0 }}}, // UI_warning (blinkers, buckle switch & doors) - }; - - return BUILD_SAFETY_CFG(tesla_model3_y_rx_checks, TESLA_M3_Y_TX_MSGS); -} - -const safety_hooks tesla_hooks = { - .init = tesla_init, - .rx = tesla_rx_hook, - .tx = tesla_tx_hook, - .fwd = tesla_fwd_hook, -}; diff --git a/opendbc/safety/safety/safety_toyota.h b/opendbc/safety/safety/safety_toyota.h deleted file mode 100644 index cb2d25ed256..00000000000 --- a/opendbc/safety/safety/safety_toyota.h +++ /dev/null @@ -1,427 +0,0 @@ -#pragma once - -#include "safety_declarations.h" - -// Stock longitudinal -#define TOYOTA_BASE_TX_MSGS \ - {0x191, 0, 8}, {0x412, 0, 8}, {0x343, 0, 8}, {0x1D2, 0, 8}, /* LKAS + LTA + ACC & PCM cancel cmds */ \ - -#define TOYOTA_COMMON_TX_MSGS \ - TOYOTA_BASE_TX_MSGS \ - {0x2E4, 0, 5}, \ - -#define TOYOTA_COMMON_SECOC_TX_MSGS \ - TOYOTA_BASE_TX_MSGS \ - {0x2E4, 0, 8}, {0x131, 0, 8}, \ - -#define TOYOTA_COMMON_LONG_TX_MSGS \ - TOYOTA_COMMON_TX_MSGS \ - {0x283, 0, 7}, {0x2E6, 0, 8}, {0x2E7, 0, 8}, {0x33E, 0, 7}, {0x344, 0, 8}, {0x365, 0, 7}, {0x366, 0, 7}, {0x4CB, 0, 8}, /* DSU bus 0 */ \ - {0x128, 1, 6}, {0x141, 1, 4}, {0x160, 1, 8}, {0x161, 1, 7}, {0x470, 1, 4}, /* DSU bus 1 */ \ - {0x411, 0, 8}, /* PCS_HUD */ \ - {0x750, 0, 8}, /* radar diagnostic address */ \ - -#define TOYOTA_COMMON_RX_CHECKS(lta) \ - {.msg = {{ 0xaa, 0, 8, .ignore_checksum = true, .ignore_counter = true, .frequency = 83U}, { 0 }, { 0 }}}, \ - {.msg = {{0x260, 0, 8, .ignore_counter = true, .quality_flag = (lta), .frequency = 50U}, { 0 }, { 0 }}}, \ - -#define TOYOTA_RX_CHECKS(lta) \ - TOYOTA_COMMON_RX_CHECKS(lta) \ - {.msg = {{0x1D2, 0, 8, .ignore_counter = true, .frequency = 33U}, { 0 }, { 0 }}}, \ - {.msg = {{0x224, 0, 8, .ignore_checksum = true, .ignore_counter = true, .frequency = 40U}, \ - {0x226, 0, 8, .ignore_checksum = true, .ignore_counter = true, .frequency = 40U}, { 0 }}}, \ - -#define TOYOTA_SECOC_RX_CHECKS \ - TOYOTA_COMMON_RX_CHECKS(false) \ - {.msg = {{0x176, 0, 8, .ignore_counter = true, .frequency = 32U}, { 0 }, { 0 }}}, \ - {.msg = {{0x116, 0, 8, .ignore_checksum = true, .ignore_counter = true, .frequency = 42U}, { 0 }, { 0 }}}, \ - {.msg = {{0x101, 0, 8, .ignore_checksum = true, .ignore_counter = true, .frequency = 50U}, { 0 }, { 0 }}}, \ - -static bool toyota_secoc = false; -static bool toyota_alt_brake = false; -static bool toyota_stock_longitudinal = false; -static bool toyota_lta = false; -static int toyota_dbc_eps_torque_factor = 100; // conversion factor for STEER_TORQUE_EPS in %: see dbc file - -static uint32_t toyota_compute_checksum(const CANPacket_t *to_push) { - int addr = GET_ADDR(to_push); - int len = GET_LEN(to_push); - uint8_t checksum = (uint8_t)(addr) + (uint8_t)((unsigned int)(addr) >> 8U) + (uint8_t)(len); - for (int i = 0; i < (len - 1); i++) { - checksum += (uint8_t)GET_BYTE(to_push, i); - } - return checksum; -} - -static uint32_t toyota_get_checksum(const CANPacket_t *to_push) { - int checksum_byte = GET_LEN(to_push) - 1U; - return (uint8_t)(GET_BYTE(to_push, checksum_byte)); -} - -static bool toyota_get_quality_flag_valid(const CANPacket_t *to_push) { - int addr = GET_ADDR(to_push); - - bool valid = false; - if (addr == 0x260) { - valid = !GET_BIT(to_push, 3U); // STEER_ANGLE_INITIALIZING - } - return valid; -} - -static void toyota_rx_hook(const CANPacket_t *to_push) { - if (GET_BUS(to_push) == 0U) { - int addr = GET_ADDR(to_push); - - // get eps motor torque (0.66 factor in dbc) - if (addr == 0x260) { - int torque_meas_new = (GET_BYTE(to_push, 5) << 8) | GET_BYTE(to_push, 6); - torque_meas_new = to_signed(torque_meas_new, 16); - - // scale by dbc_factor - torque_meas_new = (torque_meas_new * toyota_dbc_eps_torque_factor) / 100; - - // update array of sample - update_sample(&torque_meas, torque_meas_new); - - // increase torque_meas by 1 to be conservative on rounding - torque_meas.min--; - torque_meas.max++; - - // driver torque for angle limiting - int torque_driver_new = (GET_BYTE(to_push, 1) << 8) | GET_BYTE(to_push, 2); - torque_driver_new = to_signed(torque_driver_new, 16); - update_sample(&torque_driver, torque_driver_new); - - // LTA request angle should match current angle while inactive, clipped to max accepted angle. - // note that angle can be relative to init angle on some TSS2 platforms, LTA has the same offset - bool steer_angle_initializing = GET_BIT(to_push, 3U); - if (!steer_angle_initializing) { - int angle_meas_new = (GET_BYTE(to_push, 3) << 8U) | GET_BYTE(to_push, 4); - angle_meas_new = to_signed(angle_meas_new, 16); - update_sample(&angle_meas, angle_meas_new); - } - } - - // enter controls on rising edge of ACC, exit controls on ACC off - // exit controls on rising edge of gas press, if not alternative experience - // exit controls on rising edge of brake press - if (toyota_secoc) { - if (addr == 0x176) { - bool cruise_engaged = GET_BIT(to_push, 5U); // PCM_CRUISE.CRUISE_ACTIVE - pcm_cruise_check(cruise_engaged); - } - if (addr == 0x116) { - gas_pressed = GET_BYTE(to_push, 1) != 0U; // GAS_PEDAL.GAS_PEDAL_USER - } - if (addr == 0x101) { - brake_pressed = GET_BIT(to_push, 3U); // BRAKE_MODULE.BRAKE_PRESSED (toyota_rav4_prime_generated.dbc) - } - } else { - if (addr == 0x1D2) { - bool cruise_engaged = GET_BIT(to_push, 5U); // PCM_CRUISE.CRUISE_ACTIVE - pcm_cruise_check(cruise_engaged); - gas_pressed = !GET_BIT(to_push, 4U); // PCM_CRUISE.GAS_RELEASED - } - if (!toyota_alt_brake && (addr == 0x226)) { - brake_pressed = GET_BIT(to_push, 37U); // BRAKE_MODULE.BRAKE_PRESSED (toyota_nodsu_pt_generated.dbc) - } - if (toyota_alt_brake && (addr == 0x224)) { - brake_pressed = GET_BIT(to_push, 5U); // BRAKE_MODULE.BRAKE_PRESSED (toyota_new_mc_pt_generated.dbc) - } - } - - // sample speed - if (addr == 0xaa) { - int speed = 0; - // sum 4 wheel speeds. conversion: raw * 0.01 - 67.67 - for (uint8_t i = 0U; i < 8U; i += 2U) { - int wheel_speed = (GET_BYTE(to_push, i) << 8U) | GET_BYTE(to_push, (i + 1U)); - speed += wheel_speed - 6767; - } - // check that all wheel speeds are at zero value - vehicle_moving = speed != 0; - - UPDATE_VEHICLE_SPEED(speed / 4.0 * 0.01 / 3.6); - } - - bool stock_ecu_detected = addr == 0x2E4; // STEERING_LKA - if (!toyota_stock_longitudinal && (addr == 0x343)) { - stock_ecu_detected = true; // ACC_CONTROL - } - generic_rx_checks(stock_ecu_detected); - } -} - -static bool toyota_tx_hook(const CANPacket_t *to_send) { - const TorqueSteeringLimits TOYOTA_TORQUE_STEERING_LIMITS = { - .max_steer = 1500, - .max_rate_up = 15, // ramp up slow - .max_rate_down = 25, // ramp down fast - .max_torque_error = 350, // max torque cmd in excess of motor torque - .max_rt_delta = 450, // the real time limit is 1800/sec, a 20% buffer - .max_rt_interval = 250000, - .type = TorqueMotorLimited, - - // the EPS faults when the steering angle rate is above a certain threshold for too long. to prevent this, - // we allow setting STEER_REQUEST bit to 0 while maintaining the requested torque value for a single frame - .min_valid_request_frames = 18, - .max_invalid_request_frames = 1, - .min_valid_request_rt_interval = 170000, // 170ms; a ~10% buffer on cutting every 19 frames - .has_steer_req_tolerance = true, - }; - - static const AngleSteeringLimits TOYOTA_ANGLE_STEERING_LIMITS = { - // LTA angle limits - // factor for STEER_TORQUE_SENSOR->STEER_ANGLE and STEERING_LTA->STEER_ANGLE_CMD (1 / 0.0573) - .max_angle = 1657, // EPS only accepts up to 94.9461 - .angle_deg_to_can = 17.452007, - .angle_rate_up_lookup = { - {5., 25., 25.}, - {0.3, 0.15, 0.15} - }, - .angle_rate_down_lookup = { - {5., 25., 25.}, - {0.36, 0.26, 0.26} - }, - }; - - const int TOYOTA_LTA_MAX_MEAS_TORQUE = 1500; - const int TOYOTA_LTA_MAX_DRIVER_TORQUE = 150; - - // longitudinal limits - const LongitudinalLimits TOYOTA_LONG_LIMITS = { - .max_accel = 2000, // 2.0 m/s2 - .min_accel = -3500, // -3.5 m/s2 - }; - - bool tx = true; - int addr = GET_ADDR(to_send); - int bus = GET_BUS(to_send); - - // Check if msg is sent on BUS 0 - if (bus == 0) { - // ACCEL: safety check on byte 1-2 - if (addr == 0x343) { - int desired_accel = (GET_BYTE(to_send, 0) << 8) | GET_BYTE(to_send, 1); - desired_accel = to_signed(desired_accel, 16); - - bool violation = false; - violation |= longitudinal_accel_checks(desired_accel, TOYOTA_LONG_LIMITS); - - // only ACC messages that cancel are allowed when openpilot is not controlling longitudinal - if (toyota_stock_longitudinal) { - bool cancel_req = GET_BIT(to_send, 24U); - if (!cancel_req) { - violation = true; - } - if (desired_accel != TOYOTA_LONG_LIMITS.inactive_accel) { - violation = true; - } - } - - if (violation) { - tx = false; - } - } - - // AEB: block all actuation. only used when DSU is unplugged - if (addr == 0x283) { - // only allow the checksum, which is the last byte - bool block = (GET_BYTES(to_send, 0, 4) != 0U) || (GET_BYTE(to_send, 4) != 0U) || (GET_BYTE(to_send, 5) != 0U); - if (block) { - tx = false; - } - } - - // STEERING_LTA angle steering check - if (addr == 0x191) { - // check the STEER_REQUEST, STEER_REQUEST_2, TORQUE_WIND_DOWN, STEER_ANGLE_CMD signals - bool lta_request = GET_BIT(to_send, 0U); - bool lta_request2 = GET_BIT(to_send, 25U); - int torque_wind_down = GET_BYTE(to_send, 5); - int lta_angle = (GET_BYTE(to_send, 1) << 8) | GET_BYTE(to_send, 2); - lta_angle = to_signed(lta_angle, 16); - - bool steer_control_enabled = lta_request || lta_request2; - if (!toyota_lta) { - // using torque (LKA), block LTA msgs with actuation requests - if (steer_control_enabled || (lta_angle != 0) || (torque_wind_down != 0)) { - tx = false; - } - } else { - // check angle rate limits and inactive angle - if (steer_angle_cmd_checks(lta_angle, steer_control_enabled, TOYOTA_ANGLE_STEERING_LIMITS)) { - tx = false; - } - - if (lta_request != lta_request2) { - tx = false; - } - - // TORQUE_WIND_DOWN is gated on steer request - if (!steer_control_enabled && (torque_wind_down != 0)) { - tx = false; - } - - // TORQUE_WIND_DOWN can only be no or full torque - if ((torque_wind_down != 0) && (torque_wind_down != 100)) { - tx = false; - } - - // check if we should wind down torque - int driver_torque = MIN(ABS(torque_driver.min), ABS(torque_driver.max)); - if ((driver_torque > TOYOTA_LTA_MAX_DRIVER_TORQUE) && (torque_wind_down != 0)) { - tx = false; - } - - int eps_torque = MIN(ABS(torque_meas.min), ABS(torque_meas.max)); - if ((eps_torque > TOYOTA_LTA_MAX_MEAS_TORQUE) && (torque_wind_down != 0)) { - tx = false; - } - } - } - - // STEERING_LTA_2 angle steering check (SecOC) - if (toyota_secoc && (addr == 0x131)) { - // SecOC cars block any form of LTA actuation for now - bool lta_request = GET_BIT(to_send, 3U); // STEERING_LTA_2.STEER_REQUEST - bool lta_request2 = GET_BIT(to_send, 0U); // STEERING_LTA_2.STEER_REQUEST_2 - int lta_angle_msb = GET_BYTE(to_send, 2); // STEERING_LTA_2.STEER_ANGLE_CMD (MSB) - int lta_angle_lsb = GET_BYTE(to_send, 3); // STEERING_LTA_2.STEER_ANGLE_CMD (LSB) - - bool actuation = lta_request || lta_request2 || (lta_angle_msb != 0) || (lta_angle_lsb != 0); - if (actuation) { - tx = false; - } - } - - // STEER: safety check on bytes 2-3 - if (addr == 0x2E4) { - int desired_torque = (GET_BYTE(to_send, 1) << 8) | GET_BYTE(to_send, 2); - desired_torque = to_signed(desired_torque, 16); - bool steer_req = GET_BIT(to_send, 0U); - // When using LTA (angle control), assert no actuation on LKA message - if (!toyota_lta) { - if (steer_torque_cmd_checks(desired_torque, steer_req, TOYOTA_TORQUE_STEERING_LIMITS)) { - tx = false; - } - } else { - if ((desired_torque != 0) || steer_req) { - tx = false; - } - } - } - } - - // UDS: Only tester present ("\x0F\x02\x3E\x00\x00\x00\x00\x00") allowed on diagnostics address - if (addr == 0x750) { - // this address is sub-addressed. only allow tester present to radar (0xF) - bool invalid_uds_msg = (GET_BYTES(to_send, 0, 4) != 0x003E020FU) || (GET_BYTES(to_send, 4, 4) != 0x0U); - if (invalid_uds_msg) { - tx = 0; - } - } - - return tx; -} - -static safety_config toyota_init(uint16_t param) { - static const CanMsg TOYOTA_TX_MSGS[] = { - TOYOTA_COMMON_TX_MSGS - }; - - static const CanMsg TOYOTA_SECOC_TX_MSGS[] = { - TOYOTA_COMMON_SECOC_TX_MSGS - }; - - static const CanMsg TOYOTA_LONG_TX_MSGS[] = { - TOYOTA_COMMON_LONG_TX_MSGS - }; - - // safety param flags - // first byte is for EPS factor, second is for flags - const uint32_t TOYOTA_PARAM_OFFSET = 8U; - const uint32_t TOYOTA_EPS_FACTOR = (1UL << TOYOTA_PARAM_OFFSET) - 1U; - const uint32_t TOYOTA_PARAM_ALT_BRAKE = 1UL << TOYOTA_PARAM_OFFSET; - const uint32_t TOYOTA_PARAM_STOCK_LONGITUDINAL = 2UL << TOYOTA_PARAM_OFFSET; - const uint32_t TOYOTA_PARAM_LTA = 4UL << TOYOTA_PARAM_OFFSET; - -#ifdef ALLOW_DEBUG - const uint32_t TOYOTA_PARAM_SECOC = 8UL << TOYOTA_PARAM_OFFSET; - toyota_secoc = GET_FLAG(param, TOYOTA_PARAM_SECOC); -#endif - - toyota_alt_brake = GET_FLAG(param, TOYOTA_PARAM_ALT_BRAKE); - toyota_stock_longitudinal = GET_FLAG(param, TOYOTA_PARAM_STOCK_LONGITUDINAL); - toyota_lta = GET_FLAG(param, TOYOTA_PARAM_LTA); - toyota_dbc_eps_torque_factor = param & TOYOTA_EPS_FACTOR; - - safety_config ret; - if (toyota_stock_longitudinal) { - if (toyota_secoc) { - SET_TX_MSGS(TOYOTA_SECOC_TX_MSGS, ret); - } else { - SET_TX_MSGS(TOYOTA_TX_MSGS, ret); - } - } else { - SET_TX_MSGS(TOYOTA_LONG_TX_MSGS, ret); - } - - if (toyota_secoc) { - static RxCheck toyota_secoc_rx_checks[] = { - TOYOTA_SECOC_RX_CHECKS - }; - - SET_RX_CHECKS(toyota_secoc_rx_checks, ret); - } else if (toyota_lta) { - // Check the quality flag for angle measurement when using LTA, since it's not set on TSS-P cars - static RxCheck toyota_lta_rx_checks[] = { - TOYOTA_RX_CHECKS(true) - }; - - SET_RX_CHECKS(toyota_lta_rx_checks, ret); - } else { - static RxCheck toyota_lka_rx_checks[] = { - TOYOTA_RX_CHECKS(false) - }; - - SET_RX_CHECKS(toyota_lka_rx_checks, ret); - } - - return ret; -} - -static int toyota_fwd_hook(int bus_num, int addr) { - - int bus_fwd = -1; - - if (bus_num == 0) { - bus_fwd = 2; - } - - if (bus_num == 2) { - // block stock lkas messages and stock acc messages (if OP is doing ACC) - // in TSS2, 0x191 is LTA which we need to block to avoid controls collision - bool is_lkas_msg = ((addr == 0x2E4) || (addr == 0x412) || (addr == 0x191)); - // on SecOC cars 0x131 is also LTA - is_lkas_msg |= toyota_secoc && (addr == 0x131); - // in TSS2 the camera does ACC as well, so filter 0x343 - bool is_acc_msg = (addr == 0x343); - bool block_msg = is_lkas_msg || (is_acc_msg && !toyota_stock_longitudinal); - if (!block_msg) { - bus_fwd = 0; - } - } - - return bus_fwd; -} - -const safety_hooks toyota_hooks = { - .init = toyota_init, - .rx = toyota_rx_hook, - .tx = toyota_tx_hook, - .fwd = toyota_fwd_hook, - .get_checksum = toyota_get_checksum, - .compute_checksum = toyota_compute_checksum, - .get_quality_flag_valid = toyota_get_quality_flag_valid, -}; diff --git a/opendbc/safety/safety/safety_volkswagen_common.h b/opendbc/safety/safety/safety_volkswagen_common.h deleted file mode 100644 index 1285bb883ed..00000000000 --- a/opendbc/safety/safety/safety_volkswagen_common.h +++ /dev/null @@ -1,71 +0,0 @@ -#pragma once - -extern const uint16_t FLAG_VOLKSWAGEN_LONG_CONTROL; -const uint16_t FLAG_VOLKSWAGEN_LONG_CONTROL = 1; - -static uint8_t volkswagen_crc8_lut_8h2f[256]; // Static lookup table for CRC8 poly 0x2F, aka 8H2F/AUTOSAR - -extern bool volkswagen_longitudinal; -bool volkswagen_longitudinal = false; - -extern bool volkswagen_set_button_prev; -bool volkswagen_set_button_prev = false; - -extern bool volkswagen_resume_button_prev; -bool volkswagen_resume_button_prev = false; - - -#define MSG_LH_EPS_03 0x09F // RX from EPS, for driver steering torque -#define MSG_ESP_19 0x0B2 // RX from ABS, for wheel speeds -#define MSG_ESP_05 0x106 // RX from ABS, for brake switch state -#define MSG_TSK_06 0x120 // RX from ECU, for ACC status from drivetrain coordinator -#define MSG_MOTOR_20 0x121 // RX from ECU, for driver throttle input -#define MSG_ACC_06 0x122 // TX by OP, ACC control instructions to the drivetrain coordinator -#define MSG_HCA_01 0x126 // TX by OP, Heading Control Assist steering torque -#define MSG_GRA_ACC_01 0x12B // TX by OP, ACC control buttons for cancel/resume -#define MSG_ACC_07 0x12E // TX by OP, ACC control instructions to the drivetrain coordinator -#define MSG_ACC_02 0x30C // TX by OP, ACC HUD data to the instrument cluster -#define MSG_LDW_02 0x397 // TX by OP, Lane line recognition and text alerts -#define MSG_MOTOR_14 0x3BE // RX from ECU, for brake switch status - - -static uint32_t volkswagen_mqb_meb_get_checksum(const CANPacket_t *to_push) { - return (uint8_t)GET_BYTE(to_push, 0); -} - -static uint8_t volkswagen_mqb_meb_get_counter(const CANPacket_t *to_push) { - // MQB/MEB message counters are consistently found at LSB 8. - return (uint8_t)GET_BYTE(to_push, 1) & 0xFU; -} - -static uint32_t volkswagen_mqb_meb_compute_crc(const CANPacket_t *to_push) { - int addr = GET_ADDR(to_push); - int len = GET_LEN(to_push); - - // This is CRC-8H2F/AUTOSAR with a twist. See the OpenDBC implementation - // of this algorithm for a version with explanatory comments. - - uint8_t crc = 0xFFU; - for (int i = 1; i < len; i++) { - crc ^= (uint8_t)GET_BYTE(to_push, i); - crc = volkswagen_crc8_lut_8h2f[crc]; - } - - uint8_t counter = volkswagen_mqb_meb_get_counter(to_push); - if (addr == MSG_LH_EPS_03) { - crc ^= (uint8_t[]){0xF5,0xF5,0xF5,0xF5,0xF5,0xF5,0xF5,0xF5,0xF5,0xF5,0xF5,0xF5,0xF5,0xF5,0xF5,0xF5}[counter]; - } else if (addr == MSG_ESP_05) { - crc ^= (uint8_t[]){0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07}[counter]; - } else if (addr == MSG_TSK_06) { - crc ^= (uint8_t[]){0xC4,0xE2,0x4F,0xE4,0xF8,0x2F,0x56,0x81,0x9F,0xE5,0x83,0x44,0x05,0x3F,0x97,0xDF}[counter]; - } else if (addr == MSG_MOTOR_20) { - crc ^= (uint8_t[]){0xE9,0x65,0xAE,0x6B,0x7B,0x35,0xE5,0x5F,0x4E,0xC7,0x86,0xA2,0xBB,0xDD,0xEB,0xB4}[counter]; - } else if (addr == MSG_GRA_ACC_01) { - crc ^= (uint8_t[]){0x6A,0x38,0xB4,0x27,0x22,0xEF,0xE1,0xBB,0xF8,0x80,0x84,0x49,0xC7,0x9E,0x1E,0x2B}[counter]; - } else { - // Undefined CAN message, CRC check expected to fail - } - crc = volkswagen_crc8_lut_8h2f[crc]; - - return (uint8_t)(crc ^ 0xFFU); -} diff --git a/opendbc/safety/safety/safety_volkswagen_mqb.h b/opendbc/safety/safety/safety_volkswagen_mqb.h deleted file mode 100644 index be13c6fd9c4..00000000000 --- a/opendbc/safety/safety/safety_volkswagen_mqb.h +++ /dev/null @@ -1,248 +0,0 @@ -#pragma once - -#include "safety_declarations.h" -#include "safety_volkswagen_common.h" - -static bool volkswagen_mqb_brake_pedal_switch = false; -static bool volkswagen_mqb_brake_pressure_detected = false; - - -static safety_config volkswagen_mqb_init(uint16_t param) { - // Transmit of GRA_ACC_01 is allowed on bus 0 and 2 to keep compatibility with gateway and camera integration - static const CanMsg VOLKSWAGEN_MQB_STOCK_TX_MSGS[] = {{MSG_HCA_01, 0, 8}, {MSG_GRA_ACC_01, 0, 8}, {MSG_GRA_ACC_01, 2, 8}, - {MSG_LDW_02, 0, 8}, {MSG_LH_EPS_03, 2, 8}}; - - static const CanMsg VOLKSWAGEN_MQB_LONG_TX_MSGS[] = {{MSG_HCA_01, 0, 8}, {MSG_LDW_02, 0, 8}, {MSG_LH_EPS_03, 2, 8}, - {MSG_ACC_02, 0, 8}, {MSG_ACC_06, 0, 8}, {MSG_ACC_07, 0, 8}}; - - static RxCheck volkswagen_mqb_rx_checks[] = { - {.msg = {{MSG_ESP_19, 0, 8, .ignore_checksum = true, .ignore_counter = true, .frequency = 100U}, { 0 }, { 0 }}}, - {.msg = {{MSG_LH_EPS_03, 0, 8, .max_counter = 15U, .frequency = 100U}, { 0 }, { 0 }}}, - {.msg = {{MSG_ESP_05, 0, 8, .max_counter = 15U, .frequency = 50U}, { 0 }, { 0 }}}, - {.msg = {{MSG_TSK_06, 0, 8, .max_counter = 15U, .frequency = 50U}, { 0 }, { 0 }}}, - {.msg = {{MSG_MOTOR_20, 0, 8, .max_counter = 15U, .frequency = 50U}, { 0 }, { 0 }}}, - {.msg = {{MSG_MOTOR_14, 0, 8, .ignore_checksum = true, .ignore_counter = true, .frequency = 10U}, { 0 }, { 0 }}}, - {.msg = {{MSG_GRA_ACC_01, 0, 8, .max_counter = 15U, .frequency = 33U}, { 0 }, { 0 }}}, - }; - - UNUSED(param); - - volkswagen_set_button_prev = false; - volkswagen_resume_button_prev = false; - volkswagen_mqb_brake_pedal_switch = false; - volkswagen_mqb_brake_pressure_detected = false; - -#ifdef ALLOW_DEBUG - volkswagen_longitudinal = GET_FLAG(param, FLAG_VOLKSWAGEN_LONG_CONTROL); -#endif - gen_crc_lookup_table_8(0x2F, volkswagen_crc8_lut_8h2f); - return volkswagen_longitudinal ? BUILD_SAFETY_CFG(volkswagen_mqb_rx_checks, VOLKSWAGEN_MQB_LONG_TX_MSGS) : \ - BUILD_SAFETY_CFG(volkswagen_mqb_rx_checks, VOLKSWAGEN_MQB_STOCK_TX_MSGS); -} - -static void volkswagen_mqb_rx_hook(const CANPacket_t *to_push) { - if (GET_BUS(to_push) == 0U) { - int addr = GET_ADDR(to_push); - - // Update in-motion state by sampling wheel speeds - if (addr == MSG_ESP_19) { - // sum 4 wheel speeds - int speed = 0; - for (uint8_t i = 0U; i < 8U; i += 2U) { - int wheel_speed = GET_BYTE(to_push, i) | (GET_BYTE(to_push, i + 1U) << 8); - speed += wheel_speed; - } - // Check all wheel speeds for any movement - vehicle_moving = speed > 0; - } - - // Update driver input torque samples - // Signal: LH_EPS_03.EPS_Lenkmoment (absolute torque) - // Signal: LH_EPS_03.EPS_VZ_Lenkmoment (direction) - if (addr == MSG_LH_EPS_03) { - int torque_driver_new = GET_BYTE(to_push, 5) | ((GET_BYTE(to_push, 6) & 0x1FU) << 8); - int sign = (GET_BYTE(to_push, 6) & 0x80U) >> 7; - if (sign == 1) { - torque_driver_new *= -1; - } - update_sample(&torque_driver, torque_driver_new); - } - - if (addr == MSG_TSK_06) { - // When using stock ACC, enter controls on rising edge of stock ACC engage, exit on disengage - // Always exit controls on main switch off - // Signal: TSK_06.TSK_Status - int acc_status = (GET_BYTE(to_push, 3) & 0x7U); - bool cruise_engaged = (acc_status == 3) || (acc_status == 4) || (acc_status == 5); - acc_main_on = cruise_engaged || (acc_status == 2); - - if (!volkswagen_longitudinal) { - pcm_cruise_check(cruise_engaged); - } - - if (!acc_main_on) { - controls_allowed = false; - } - } - - if (addr == MSG_GRA_ACC_01) { - // If using openpilot longitudinal, enter controls on falling edge of Set or Resume with main switch on - // Signal: GRA_ACC_01.GRA_Tip_Setzen - // Signal: GRA_ACC_01.GRA_Tip_Wiederaufnahme - if (volkswagen_longitudinal) { - bool set_button = GET_BIT(to_push, 16U); - bool resume_button = GET_BIT(to_push, 19U); - if ((volkswagen_set_button_prev && !set_button) || (volkswagen_resume_button_prev && !resume_button)) { - controls_allowed = acc_main_on; - } - volkswagen_set_button_prev = set_button; - volkswagen_resume_button_prev = resume_button; - } - // Always exit controls on rising edge of Cancel - // Signal: GRA_ACC_01.GRA_Abbrechen - if (GET_BIT(to_push, 13U)) { - controls_allowed = false; - } - } - - // Signal: Motor_20.MO_Fahrpedalrohwert_01 - if (addr == MSG_MOTOR_20) { - gas_pressed = ((GET_BYTES(to_push, 0, 4) >> 12) & 0xFFU) != 0U; - } - - // Signal: Motor_14.MO_Fahrer_bremst (ECU detected brake pedal switch F63) - if (addr == MSG_MOTOR_14) { - volkswagen_mqb_brake_pedal_switch = (GET_BYTE(to_push, 3) & 0x10U) >> 4; - } - - // Signal: ESP_05.ESP_Fahrer_bremst (ESP detected driver brake pressure above platform specified threshold) - if (addr == MSG_ESP_05) { - volkswagen_mqb_brake_pressure_detected = (GET_BYTE(to_push, 3) & 0x4U) >> 2; - } - - brake_pressed = volkswagen_mqb_brake_pedal_switch || volkswagen_mqb_brake_pressure_detected; - - generic_rx_checks((addr == MSG_HCA_01)); - } -} - -static bool volkswagen_mqb_tx_hook(const CANPacket_t *to_send) { - // lateral limits - const TorqueSteeringLimits VOLKSWAGEN_MQB_STEERING_LIMITS = { - .max_steer = 300, // 3.0 Nm (EPS side max of 3.0Nm with fault if violated) - .max_rt_delta = 75, // 4 max rate up * 50Hz send rate * 250000 RT interval / 1000000 = 50 ; 50 * 1.5 for safety pad = 75 - .max_rt_interval = 250000, // 250ms between real time checks - .max_rate_up = 4, // 2.0 Nm/s RoC limit (EPS rack has own soft-limit of 5.0 Nm/s) - .max_rate_down = 10, // 5.0 Nm/s RoC limit (EPS rack has own soft-limit of 5.0 Nm/s) - .driver_torque_allowance = 80, - .driver_torque_multiplier = 3, - .type = TorqueDriverLimited, - }; - - // longitudinal limits - // acceleration in m/s2 * 1000 to avoid floating point math - const LongitudinalLimits VOLKSWAGEN_MQB_LONG_LIMITS = { - .max_accel = 2000, - .min_accel = -3500, - .inactive_accel = 3010, // VW sends one increment above the max range when inactive - }; - - int addr = GET_ADDR(to_send); - bool tx = true; - - // Safety check for HCA_01 Heading Control Assist torque - // Signal: HCA_01.HCA_01_LM_Offset (absolute torque) - // Signal: HCA_01.HCA_01_LM_OffSign (direction) - if (addr == MSG_HCA_01) { - int desired_torque = GET_BYTE(to_send, 2) | ((GET_BYTE(to_send, 3) & 0x1U) << 8); - bool sign = GET_BIT(to_send, 31U); - if (sign) { - desired_torque *= -1; - } - - bool steer_req = GET_BIT(to_send, 30U); - - if (steer_torque_cmd_checks(desired_torque, steer_req, VOLKSWAGEN_MQB_STEERING_LIMITS)) { - tx = false; - } - } - - // Safety check for both ACC_06 and ACC_07 acceleration requests - // To avoid floating point math, scale upward and compare to pre-scaled safety m/s2 boundaries - if ((addr == MSG_ACC_06) || (addr == MSG_ACC_07)) { - bool violation = false; - int desired_accel = 0; - - if (addr == MSG_ACC_06) { - // Signal: ACC_06.ACC_Sollbeschleunigung_02 (acceleration in m/s2, scale 0.005, offset -7.22) - desired_accel = ((((GET_BYTE(to_send, 4) & 0x7U) << 8) | GET_BYTE(to_send, 3)) * 5U) - 7220U; - } else { - // Signal: ACC_07.ACC_Folgebeschl (acceleration in m/s2, scale 0.03, offset -4.6) - int secondary_accel = (GET_BYTE(to_send, 4) * 30U) - 4600U; - violation |= (secondary_accel != 3020); // enforce always inactive (one increment above max range) at this time - // Signal: ACC_07.ACC_Sollbeschleunigung_02 (acceleration in m/s2, scale 0.005, offset -7.22) - desired_accel = (((GET_BYTE(to_send, 7) << 3) | ((GET_BYTE(to_send, 6) & 0xE0U) >> 5)) * 5U) - 7220U; - } - - violation |= longitudinal_accel_checks(desired_accel, VOLKSWAGEN_MQB_LONG_LIMITS); - - if (violation) { - tx = false; - } - } - - // FORCE CANCEL: ensuring that only the cancel button press is sent when controls are off. - // This avoids unintended engagements while still allowing resume spam - if ((addr == MSG_GRA_ACC_01) && !controls_allowed) { - // disallow resume and set: bits 16 and 19 - if ((GET_BYTE(to_send, 2) & 0x9U) != 0U) { - tx = false; - } - } - - return tx; -} - -static int volkswagen_mqb_fwd_hook(int bus_num, int addr) { - int bus_fwd = -1; - - switch (bus_num) { - case 0: - if (addr == MSG_LH_EPS_03) { - // openpilot needs to replace apparent driver steering input torque to pacify VW Emergency Assist - bus_fwd = -1; - } else { - // Forward all remaining traffic from Extended CAN onward - bus_fwd = 2; - } - break; - case 2: - if ((addr == MSG_HCA_01) || (addr == MSG_LDW_02)) { - // openpilot takes over LKAS steering control and related HUD messages from the camera - bus_fwd = -1; - } else if (volkswagen_longitudinal && ((addr == MSG_ACC_02) || (addr == MSG_ACC_06) || (addr == MSG_ACC_07))) { - // openpilot takes over acceleration/braking control and related HUD messages from the stock ACC radar - bus_fwd = -1; - } else { - // Forward all remaining traffic from Extended CAN devices to J533 gateway - bus_fwd = 0; - } - break; - default: - // No other buses should be in use; fallback to do-not-forward - bus_fwd = -1; - break; - } - - return bus_fwd; -} - -const safety_hooks volkswagen_mqb_hooks = { - .init = volkswagen_mqb_init, - .rx = volkswagen_mqb_rx_hook, - .tx = volkswagen_mqb_tx_hook, - .fwd = volkswagen_mqb_fwd_hook, - .get_counter = volkswagen_mqb_meb_get_counter, - .get_checksum = volkswagen_mqb_meb_get_checksum, - .compute_checksum = volkswagen_mqb_meb_compute_crc, -}; diff --git a/opendbc/safety/safety/safety_volkswagen_pq.h b/opendbc/safety/safety/safety_volkswagen_pq.h deleted file mode 100644 index 672edba7816..00000000000 --- a/opendbc/safety/safety/safety_volkswagen_pq.h +++ /dev/null @@ -1,259 +0,0 @@ -#pragma once - -#include "safety_declarations.h" -#include "safety_volkswagen_common.h" - -#define MSG_LENKHILFE_3 0x0D0 // RX from EPS, for steering angle and driver steering torque -#define MSG_HCA_1 0x0D2 // TX by OP, Heading Control Assist steering torque -#define MSG_BREMSE_1 0x1A0 // RX from ABS, for ego speed -#define MSG_MOTOR_2 0x288 // RX from ECU, for CC state and brake switch state -#define MSG_ACC_SYSTEM 0x368 // TX by OP, longitudinal acceleration controls -#define MSG_MOTOR_3 0x380 // RX from ECU, for driver throttle input -#define MSG_GRA_NEU 0x38A // TX by OP, ACC control buttons for cancel/resume -#define MSG_MOTOR_5 0x480 // RX from ECU, for ACC main switch state -#define MSG_ACC_GRA_ANZEIGE 0x56A // TX by OP, ACC HUD -#define MSG_LDW_1 0x5BE // TX by OP, Lane line recognition and text alerts - -static uint32_t volkswagen_pq_get_checksum(const CANPacket_t *to_push) { - int addr = GET_ADDR(to_push); - - return (uint32_t)GET_BYTE(to_push, (addr == MSG_MOTOR_5) ? 7 : 0); -} - -static uint8_t volkswagen_pq_get_counter(const CANPacket_t *to_push) { - int addr = GET_ADDR(to_push); - uint8_t counter = 0U; - - if (addr == MSG_LENKHILFE_3) { - counter = (uint8_t)(GET_BYTE(to_push, 1) & 0xF0U) >> 4; - } else if (addr == MSG_GRA_NEU) { - counter = (uint8_t)(GET_BYTE(to_push, 2) & 0xF0U) >> 4; - } else { - } - - return counter; -} - -static uint32_t volkswagen_pq_compute_checksum(const CANPacket_t *to_push) { - int addr = GET_ADDR(to_push); - int len = GET_LEN(to_push); - uint8_t checksum = 0U; - int checksum_byte = (addr == MSG_MOTOR_5) ? 7 : 0; - - // Simple XOR over the payload, except for the byte where the checksum lives. - for (int i = 0; i < len; i++) { - if (i != checksum_byte) { - checksum ^= (uint8_t)GET_BYTE(to_push, i); - } - } - - return checksum; -} - -static safety_config volkswagen_pq_init(uint16_t param) { - // Transmit of GRA_Neu is allowed on bus 0 and 2 to keep compatibility with gateway and camera integration - static const CanMsg VOLKSWAGEN_PQ_STOCK_TX_MSGS[] = {{MSG_HCA_1, 0, 5}, {MSG_LDW_1, 0, 8}, - {MSG_GRA_NEU, 0, 4}, {MSG_GRA_NEU, 2, 4}}; - - static const CanMsg VOLKSWAGEN_PQ_LONG_TX_MSGS[] = {{MSG_HCA_1, 0, 5}, {MSG_LDW_1, 0, 8}, - {MSG_ACC_SYSTEM, 0, 8}, {MSG_ACC_GRA_ANZEIGE, 0, 8}}; - - static RxCheck volkswagen_pq_rx_checks[] = { - {.msg = {{MSG_LENKHILFE_3, 0, 6, .max_counter = 15U, .frequency = 100U}, { 0 }, { 0 }}}, - {.msg = {{MSG_BREMSE_1, 0, 8, .ignore_checksum = true, .ignore_counter = true, .frequency = 100U}, { 0 }, { 0 }}}, - {.msg = {{MSG_MOTOR_2, 0, 8, .ignore_checksum = true, .ignore_counter = true, .frequency = 50U}, { 0 }, { 0 }}}, - {.msg = {{MSG_MOTOR_3, 0, 8, .ignore_checksum = true, .ignore_counter = true, .frequency = 100U}, { 0 }, { 0 }}}, - {.msg = {{MSG_MOTOR_5, 0, 8, .ignore_counter = true, .frequency = 50U}, { 0 }, { 0 }}}, - {.msg = {{MSG_GRA_NEU, 0, 4, .max_counter = 15U, .frequency = 30U}, { 0 }, { 0 }}}, - }; - - UNUSED(param); - - volkswagen_set_button_prev = false; - volkswagen_resume_button_prev = false; - -#ifdef ALLOW_DEBUG - volkswagen_longitudinal = GET_FLAG(param, FLAG_VOLKSWAGEN_LONG_CONTROL); -#endif - return volkswagen_longitudinal ? BUILD_SAFETY_CFG(volkswagen_pq_rx_checks, VOLKSWAGEN_PQ_LONG_TX_MSGS) : \ - BUILD_SAFETY_CFG(volkswagen_pq_rx_checks, VOLKSWAGEN_PQ_STOCK_TX_MSGS); -} - -static void volkswagen_pq_rx_hook(const CANPacket_t *to_push) { - if (GET_BUS(to_push) == 0U) { - int addr = GET_ADDR(to_push); - - // Update in-motion state from speed value. - // Signal: Bremse_1.Geschwindigkeit_neu__Bremse_1_ - if (addr == MSG_BREMSE_1) { - int speed = ((GET_BYTE(to_push, 2) & 0xFEU) >> 1) | (GET_BYTE(to_push, 3) << 7); - vehicle_moving = speed > 0; - } - - // Update driver input torque samples - // Signal: Lenkhilfe_3.LH3_LM (absolute torque) - // Signal: Lenkhilfe_3.LH3_LMSign (direction) - if (addr == MSG_LENKHILFE_3) { - int torque_driver_new = GET_BYTE(to_push, 2) | ((GET_BYTE(to_push, 3) & 0x3U) << 8); - int sign = (GET_BYTE(to_push, 3) & 0x4U) >> 2; - if (sign == 1) { - torque_driver_new *= -1; - } - update_sample(&torque_driver, torque_driver_new); - } - - if (volkswagen_longitudinal) { - if (addr == MSG_MOTOR_5) { - // ACC main switch on is a prerequisite to enter controls, exit controls immediately on main switch off - // Signal: Motor_5.GRA_Hauptschalter - acc_main_on = GET_BIT(to_push, 50U); - if (!acc_main_on) { - controls_allowed = false; - } - } - - if (addr == MSG_GRA_NEU) { - // If ACC main switch is on, enter controls on falling edge of Set or Resume - // Signal: GRA_Neu.GRA_Neu_Setzen - // Signal: GRA_Neu.GRA_Neu_Recall - bool set_button = GET_BIT(to_push, 16U); - bool resume_button = GET_BIT(to_push, 17U); - if ((volkswagen_set_button_prev && !set_button) || (volkswagen_resume_button_prev && !resume_button)) { - controls_allowed = acc_main_on; - } - volkswagen_set_button_prev = set_button; - volkswagen_resume_button_prev = resume_button; - // Exit controls on rising edge of Cancel, override Set/Resume if present simultaneously - // Signal: GRA_ACC_01.GRA_Abbrechen - if (GET_BIT(to_push, 9U)) { - controls_allowed = false; - } - } - } else { - if (addr == MSG_MOTOR_2) { - // Enter controls on rising edge of stock ACC, exit controls if stock ACC disengages - // Signal: Motor_2.GRA_Status - int acc_status = (GET_BYTE(to_push, 2) & 0xC0U) >> 6; - bool cruise_engaged = (acc_status == 1) || (acc_status == 2); - pcm_cruise_check(cruise_engaged); - } - } - - // Signal: Motor_3.Fahrpedal_Rohsignal - if (addr == MSG_MOTOR_3) { - gas_pressed = (GET_BYTE(to_push, 2)); - } - - // Signal: Motor_2.Bremslichtschalter - if (addr == MSG_MOTOR_2) { - brake_pressed = (GET_BYTE(to_push, 2) & 0x1U); - } - - generic_rx_checks((addr == MSG_HCA_1)); - } -} - -static bool volkswagen_pq_tx_hook(const CANPacket_t *to_send) { - // lateral limits - const TorqueSteeringLimits VOLKSWAGEN_PQ_STEERING_LIMITS = { - .max_steer = 300, // 3.0 Nm (EPS side max of 3.0Nm with fault if violated) - .max_rt_delta = 113, // 6 max rate up * 50Hz send rate * 250000 RT interval / 1000000 = 75 ; 125 * 1.5 for safety pad = 113 - .max_rt_interval = 250000, // 250ms between real time checks - .max_rate_up = 6, // 3.0 Nm/s RoC limit (EPS rack has own soft-limit of 5.0 Nm/s) - .max_rate_down = 10, // 5.0 Nm/s RoC limit (EPS rack has own soft-limit of 5.0 Nm/s) - .driver_torque_multiplier = 3, - .driver_torque_allowance = 80, - .type = TorqueDriverLimited, - }; - - // longitudinal limits - // acceleration in m/s2 * 1000 to avoid floating point math - const LongitudinalLimits VOLKSWAGEN_PQ_LONG_LIMITS = { - .max_accel = 2000, - .min_accel = -3500, - .inactive_accel = 3010, // VW sends one increment above the max range when inactive - }; - - int addr = GET_ADDR(to_send); - bool tx = true; - - // Safety check for HCA_1 Heading Control Assist torque - // Signal: HCA_1.LM_Offset (absolute torque) - // Signal: HCA_1.LM_Offsign (direction) - if (addr == MSG_HCA_1) { - int desired_torque = GET_BYTE(to_send, 2) | ((GET_BYTE(to_send, 3) & 0x7FU) << 8); - desired_torque = desired_torque / 32; // DBC scale from PQ network to centi-Nm - int sign = (GET_BYTE(to_send, 3) & 0x80U) >> 7; - if (sign == 1) { - desired_torque *= -1; - } - - uint32_t hca_status = ((GET_BYTE(to_send, 1) >> 4) & 0xFU); - bool steer_req = ((hca_status == 5U) || (hca_status == 7U)); - - if (steer_torque_cmd_checks(desired_torque, steer_req, VOLKSWAGEN_PQ_STEERING_LIMITS)) { - tx = false; - } - } - - // Safety check for acceleration commands - // To avoid floating point math, scale upward and compare to pre-scaled safety m/s2 boundaries - if (addr == MSG_ACC_SYSTEM) { - // Signal: ACC_System.ACS_Sollbeschl (acceleration in m/s2, scale 0.005, offset -7.22) - int desired_accel = ((((GET_BYTE(to_send, 4) & 0x7U) << 8) | GET_BYTE(to_send, 3)) * 5U) - 7220U; - - if (longitudinal_accel_checks(desired_accel, VOLKSWAGEN_PQ_LONG_LIMITS)) { - tx = false; - } - } - - // FORCE CANCEL: ensuring that only the cancel button press is sent when controls are off. - // This avoids unintended engagements while still allowing resume spam - if ((addr == MSG_GRA_NEU) && !controls_allowed) { - // Signal: GRA_Neu.GRA_Neu_Setzen - // Signal: GRA_Neu.GRA_Neu_Recall - if (GET_BIT(to_send, 16U) || GET_BIT(to_send, 17U)) { - tx = false; - } - } - - return tx; -} - -static int volkswagen_pq_fwd_hook(int bus_num, int addr) { - int bus_fwd = -1; - - switch (bus_num) { - case 0: - // Forward all traffic from the Extended CAN onward - bus_fwd = 2; - break; - case 2: - if ((addr == MSG_HCA_1) || (addr == MSG_LDW_1)) { - // openpilot takes over LKAS steering control and related HUD messages from the camera - bus_fwd = -1; - } else if (volkswagen_longitudinal && ((addr == MSG_ACC_SYSTEM) || (addr == MSG_ACC_GRA_ANZEIGE))) { - // openpilot takes over acceleration/braking control and related HUD messages from the stock ACC radar - } else { - // Forward all remaining traffic from Extended CAN devices to J533 gateway - bus_fwd = 0; - } - break; - default: - // No other buses should be in use; fallback to do-not-forward - bus_fwd = -1; - break; - } - - return bus_fwd; -} - -const safety_hooks volkswagen_pq_hooks = { - .init = volkswagen_pq_init, - .rx = volkswagen_pq_rx_hook, - .tx = volkswagen_pq_tx_hook, - .fwd = volkswagen_pq_fwd_hook, - .get_counter = volkswagen_pq_get_counter, - .get_checksum = volkswagen_pq_get_checksum, - .compute_checksum = volkswagen_pq_compute_checksum, -}; diff --git a/opendbc/safety/safety_declarations.h b/opendbc/safety/safety_declarations.h deleted file mode 100644 index 27c06bb8998..00000000000 --- a/opendbc/safety/safety_declarations.h +++ /dev/null @@ -1,290 +0,0 @@ -#pragma once - -#include -#include - -#define GET_BIT(msg, b) ((bool)!!(((msg)->data[((b) / 8U)] >> ((b) % 8U)) & 0x1U)) -#define GET_BYTE(msg, b) ((msg)->data[(b)]) -#define GET_FLAG(value, mask) (((__typeof__(mask))(value) & (mask)) == (mask)) // cppcheck-suppress misra-c2012-1.2; allow __typeof__ - -#define BUILD_SAFETY_CFG(rx, tx) ((safety_config){(rx), (sizeof((rx)) / sizeof((rx)[0])), \ - (tx), (sizeof((tx)) / sizeof((tx)[0]))}) -#define SET_RX_CHECKS(rx, config) \ - do { \ - (config).rx_checks = (rx); \ - (config).rx_checks_len = sizeof((rx)) / sizeof((rx)[0]); \ - } while (0); - -#define SET_TX_MSGS(tx, config) \ - do { \ - (config).tx_msgs = (tx); \ - (config).tx_msgs_len = sizeof((tx)) / sizeof((tx)[0]); \ - } while(0); - -#define UPDATE_VEHICLE_SPEED(val_ms) (update_sample(&vehicle_speed, ROUND((val_ms) * VEHICLE_SPEED_FACTOR))) - -uint32_t GET_BYTES(const CANPacket_t *msg, int start, int len); - -extern const int MAX_WRONG_COUNTERS; -#define MAX_ADDR_CHECK_MSGS 3U -#define MAX_SAMPLE_VALS 6 -// used to represent floating point vehicle speed in a sample_t -#define VEHICLE_SPEED_FACTOR 1000.0 - - -// sample struct that keeps 6 samples in memory -struct sample_t { - int values[MAX_SAMPLE_VALS]; - int min; - int max; -}; - -// safety code requires floats -struct lookup_t { - float x[3]; - float y[3]; -}; - -typedef struct { - int addr; - int bus; - int len; -} CanMsg; - -typedef enum { - TorqueMotorLimited, // torque steering command, limited by EPS output torque - TorqueDriverLimited, // torque steering command, limited by driver's input torque -} SteeringControlType; - -typedef struct { - // torque cmd limits - const int max_steer; - const int max_rate_up; - const int max_rate_down; - const int max_rt_delta; - const uint32_t max_rt_interval; - - const SteeringControlType type; - - // driver torque limits - const int driver_torque_allowance; - const int driver_torque_multiplier; - - // motor torque limits - const int max_torque_error; - - // safety around steer req bit - const int min_valid_request_frames; - const int max_invalid_request_frames; - const uint32_t min_valid_request_rt_interval; - const bool has_steer_req_tolerance; -} TorqueSteeringLimits; - -typedef struct { - // angle cmd limits (also used by curvature control cars) - const int max_angle; - - const float angle_deg_to_can; - const struct lookup_t angle_rate_up_lookup; - const struct lookup_t angle_rate_down_lookup; - const int max_angle_error; // used to limit error between meas and cmd while enabled - const float angle_error_min_speed; // minimum speed to start limiting angle error - - const bool angle_is_curvature; // if true, we can apply max lateral acceleration limits - const bool enforce_angle_error; // enables max_angle_error check - const bool inactive_angle_is_zero; // if false, enforces angle near meas when disabled (default) -} AngleSteeringLimits; - -typedef struct { - // acceleration cmd limits - const int max_accel; - const int min_accel; - const int inactive_accel; - - // gas & brake cmd limits - // inactive and min gas are 0 on most safety modes - const int max_gas; - const int min_gas; - const int inactive_gas; - const int max_brake; - - // transmission rpm limits - const int max_transmission_rpm; - const int min_transmission_rpm; - const int inactive_transmission_rpm; - - // speed cmd limits - const int inactive_speed; -} LongitudinalLimits; - -typedef struct { - const int addr; - const int bus; - const int len; - const bool ignore_checksum; // checksum check is not performed when set to true - const bool ignore_counter; // counter check is not performed when set to true - const uint8_t max_counter; // maximum value of the counter. 0 means that the counter check is skipped - const bool quality_flag; // true is quality flag check is performed - const uint32_t frequency; // expected frequency of the message [Hz] -} CanMsgCheck; - -typedef struct { - // dynamic flags, reset on safety mode init - bool msg_seen; - int index; // if multiple messages are allowed to be checked, this stores the index of the first one seen. only msg[msg_index] will be used - bool valid_checksum; // true if and only if checksum check is passed - int wrong_counters; // counter of wrong counters, saturated between 0 and MAX_WRONG_COUNTERS - bool valid_quality_flag; // true if the message's quality/health/status signals are valid - uint8_t last_counter; // last counter value - uint32_t last_timestamp; // micro-s - bool lagging; // true if and only if the time between updates is excessive -} RxStatus; - -// params and flags about checksum, counter and frequency checks for each monitored address -typedef struct { - const CanMsgCheck msg[MAX_ADDR_CHECK_MSGS]; // check either messages (e.g. honda steer) - RxStatus status; -} RxCheck; - -typedef struct { - RxCheck *rx_checks; - int rx_checks_len; - const CanMsg *tx_msgs; - int tx_msgs_len; -} safety_config; - -typedef uint32_t (*get_checksum_t)(const CANPacket_t *to_push); -typedef uint32_t (*compute_checksum_t)(const CANPacket_t *to_push); -typedef uint8_t (*get_counter_t)(const CANPacket_t *to_push); -typedef bool (*get_quality_flag_valid_t)(const CANPacket_t *to_push); - -typedef safety_config (*safety_hook_init)(uint16_t param); -typedef void (*rx_hook)(const CANPacket_t *to_push); -typedef bool (*tx_hook)(const CANPacket_t *to_send); -typedef int (*fwd_hook)(int bus_num, int addr); - -typedef struct { - safety_hook_init init; - rx_hook rx; - tx_hook tx; - fwd_hook fwd; - get_checksum_t get_checksum; - compute_checksum_t compute_checksum; - get_counter_t get_counter; - get_quality_flag_valid_t get_quality_flag_valid; -} safety_hooks; - -bool safety_rx_hook(const CANPacket_t *to_push); -bool safety_tx_hook(CANPacket_t *to_send); -uint32_t get_ts_elapsed(uint32_t ts, uint32_t ts_last); -int to_signed(int d, int bits); -void update_sample(struct sample_t *sample, int sample_new); -bool get_longitudinal_allowed(void); -int ROUND(float val); -void gen_crc_lookup_table_8(uint8_t poly, uint8_t crc_lut[]); -#ifdef CANFD -void gen_crc_lookup_table_16(uint16_t poly, uint16_t crc_lut[]); -#endif -void generic_rx_checks(bool stock_ecu_detected); -bool steer_torque_cmd_checks(int desired_torque, int steer_req, const TorqueSteeringLimits limits); -bool steer_angle_cmd_checks(int desired_angle, bool steer_control_enabled, const AngleSteeringLimits limits); -bool longitudinal_accel_checks(int desired_accel, const LongitudinalLimits limits); -bool longitudinal_speed_checks(int desired_speed, const LongitudinalLimits limits); -bool longitudinal_gas_checks(int desired_gas, const LongitudinalLimits limits); -bool longitudinal_transmission_rpm_checks(int desired_transmission_rpm, const LongitudinalLimits limits); -bool longitudinal_brake_checks(int desired_brake, const LongitudinalLimits limits); -void pcm_cruise_check(bool cruise_engaged); - -void safety_tick(const safety_config *safety_config); - -// This can be set by the safety hooks -extern bool controls_allowed; -extern bool relay_malfunction; -extern bool gas_pressed; -extern bool gas_pressed_prev; -extern bool brake_pressed; -extern bool brake_pressed_prev; -extern bool regen_braking; -extern bool regen_braking_prev; -extern bool cruise_engaged_prev; -extern struct sample_t vehicle_speed; -extern bool vehicle_moving; -extern bool acc_main_on; // referred to as "ACC off" in ISO 15622:2018 -extern int cruise_button_prev; -extern bool safety_rx_checks_invalid; - -// for safety modes with torque steering control -extern int desired_torque_last; // last desired steer torque -extern int rt_torque_last; // last desired torque for real time check -extern int valid_steer_req_count; // counter for steer request bit matching non-zero torque -extern int invalid_steer_req_count; // counter to allow multiple frames of mismatching torque request bit -extern struct sample_t torque_meas; // last 6 motor torques produced by the eps -extern struct sample_t torque_driver; // last 6 driver torques measured -extern uint32_t ts_torque_check_last; -extern uint32_t ts_steer_req_mismatch_last; // last timestamp steer req was mismatched with torque - -// state for controls_allowed timeout logic -extern bool heartbeat_engaged; // openpilot enabled, passed in heartbeat USB command -extern uint32_t heartbeat_engaged_mismatches; // count of mismatches between heartbeat_engaged and controls_allowed - -// for safety modes with angle steering control -extern uint32_t ts_angle_last; -extern int desired_angle_last; -extern struct sample_t angle_meas; // last 6 steer angles/curvatures - -// This can be set with a USB command -// It enables features that allow alternative experiences, like not disengaging on gas press -// It is only either 0 or 1 on mainline comma.ai openpilot - -#define ALT_EXP_DISABLE_DISENGAGE_ON_GAS 1 - -// If using this flag, make sure to communicate to your users that a stock safety feature is now disabled. -#define ALT_EXP_DISABLE_STOCK_AEB 2 - -// If using this flag, be aware that harder braking is more likely to lead to rear endings, -// and that alone this flag doesn't make braking compliant because there's also a time element. -// Setting this flag is used for allowing the full -5.0 to +4.0 m/s^2 at lower speeds -// See ISO 15622:2018 for more information. -#define ALT_EXP_RAISE_LONGITUDINAL_LIMITS_TO_ISO_MAX 8 - -// This flag allows AEB to be commanded from openpilot. -#define ALT_EXP_ALLOW_AEB 16 - -extern int alternative_experience; - -// time since safety mode has been changed -extern uint32_t safety_mode_cnt; - -typedef struct { - uint16_t id; - const safety_hooks *hooks; -} safety_hook_config; - -extern uint16_t current_safety_mode; -extern uint16_t current_safety_param; -extern safety_config current_safety_config; - -int safety_fwd_hook(int bus_num, int addr); -int set_safety_hooks(uint16_t mode, uint16_t param); - -extern const safety_hooks body_hooks; -extern const safety_hooks chrysler_hooks; -extern const safety_hooks elm327_hooks; -extern const safety_hooks nooutput_hooks; -extern const safety_hooks alloutput_hooks; -extern const safety_hooks ford_hooks; -extern const safety_hooks gm_hooks; -extern const safety_hooks honda_nidec_hooks; -extern const safety_hooks honda_bosch_hooks; -extern const safety_hooks hyundai_canfd_hooks; -extern const safety_hooks hyundai_hooks; -extern const safety_hooks hyundai_legacy_hooks; -extern const safety_hooks mazda_hooks; -extern const safety_hooks nissan_hooks; -extern const safety_hooks subaru_hooks; -extern const safety_hooks subaru_preglobal_hooks; -extern const safety_hooks tesla_hooks; -extern const safety_hooks toyota_hooks; -extern const safety_hooks volkswagen_mqb_hooks; -extern const safety_hooks volkswagen_pq_hooks; -extern const safety_hooks rivian_hooks; diff --git a/opendbc/safety/tests/__init__.py b/opendbc/safety/tests/__init__.py deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/opendbc/safety/tests/common.py b/opendbc/safety/tests/common.py deleted file mode 100644 index 9fded87af0c..00000000000 --- a/opendbc/safety/tests/common.py +++ /dev/null @@ -1,993 +0,0 @@ -import os -import abc -import unittest -import importlib -import numpy as np -from collections.abc import Callable - -from opendbc.can.packer import CANPacker # pylint: disable=import-error -from opendbc.safety import ALTERNATIVE_EXPERIENCE -from opendbc.safety.tests.libsafety import libsafety_py - -MAX_WRONG_COUNTERS = 5 -MAX_SAMPLE_VALS = 6 - -MessageFunction = Callable[[float], libsafety_py.CANPacket] - -def sign_of(a): - return 1 if a > 0 else -1 - - -def make_msg(bus, addr, length=8, dat=None): - if dat is None: - dat = b'\x00' * length - return libsafety_py.make_CANPacket(addr, bus, dat) - - -class CANPackerPanda(CANPacker): - def make_can_msg_panda(self, name_or_addr, bus, values, fix_checksum=None): - msg = self.make_can_msg(name_or_addr, bus, values) - if fix_checksum is not None: - msg = fix_checksum(msg) - addr, dat, bus = msg - return libsafety_py.make_CANPacket(addr, bus, dat) - - -def add_regen_tests(cls): - """Dynamically adds regen tests for all user brake tests.""" - - # only rx/user brake tests, not brake command - found_tests = [func for func in dir(cls) if func.startswith("test_") and "user_brake" in func] - assert len(found_tests) >= 3, "Failed to detect known brake tests" - - for test in found_tests: - def _make_regen_test(brake_func): - def _regen_test(self): - # only for safety modes with a regen message - if self._user_regen_msg(0) is None: - raise unittest.SkipTest("Safety mode implements no _user_regen_msg") - - getattr(self, brake_func)(self._user_regen_msg, self.safety.get_regen_braking_prev) - return _regen_test - - setattr(cls, test.replace("brake", "regen"), _make_regen_test(test)) - - return cls - - -class PandaSafetyTestBase(unittest.TestCase): - safety: libsafety_py.Panda - - @classmethod - def setUpClass(cls): - if cls.__name__ == "PandaSafetyTestBase": - cls.safety = None - raise unittest.SkipTest - - def _reset_safety_hooks(self): - self.safety.set_safety_hooks(self.safety.get_current_safety_mode(), - self.safety.get_current_safety_param()) - - def _rx(self, msg): - return self.safety.safety_rx_hook(msg) - - def _tx(self, msg): - return self.safety.safety_tx_hook(msg) - - def _generic_limit_safety_check(self, msg_function: MessageFunction, min_allowed_value: float, max_allowed_value: float, - min_possible_value: float, max_possible_value: float, test_delta: float = 1, inactive_value: float = 0, - msg_allowed = True, additional_setup: Callable[[float], None] | None = None): - """ - Enforces that a signal within a message is only allowed to be sent within a specific range, min_allowed_value -> max_allowed_value. - Tests the range of min_possible_value -> max_possible_value with a delta of test_delta. - Message is also only allowed to be sent when controls_allowed is true, unless the value is equal to inactive_value. - Message is never allowed if msg_allowed is false, for example when stock longitudinal is enabled and you are sending acceleration requests. - additional_setup is used for extra setup before each _tx, ex: for setting the previous torque for rate limits - """ - - # Ensure that we at least test the allowed_value range - self.assertGreater(max_possible_value, max_allowed_value) - self.assertLessEqual(min_possible_value, min_allowed_value) - - for controls_allowed in [False, True]: - # enforce we don't skip over 0 or inactive - for v in np.concatenate((np.arange(min_possible_value, max_possible_value, test_delta), np.array([0, inactive_value]))): - v = round(v, 2) # floats might not hit exact boundary conditions without rounding - self.safety.set_controls_allowed(controls_allowed) - if additional_setup is not None: - additional_setup(v) - should_tx = controls_allowed and min_allowed_value <= v <= max_allowed_value - should_tx = (should_tx or v == inactive_value) and msg_allowed - self.assertEqual(self._tx(msg_function(v)), should_tx, (controls_allowed, should_tx, v)) - - def _common_measurement_test(self, msg_func: Callable, min_value: float, max_value: float, factor: float, - meas_min_func: Callable[[], int], meas_max_func: Callable[[], int]): - """Tests accurate measurement parsing, and that the struct is reset on safety mode init""" - for val in np.arange(min_value, max_value, 0.5): - for i in range(MAX_SAMPLE_VALS): - self.assertTrue(self._rx(msg_func(val + i * 0.1))) - - # assert close by one decimal place - self.assertAlmostEqual(meas_min_func() / factor, val, delta=0.1) - self.assertAlmostEqual(meas_max_func() / factor - 0.5, val, delta=0.1) - - # ensure sample_t is reset on safety init - self._reset_safety_hooks() - self.assertEqual(meas_min_func(), 0) - self.assertEqual(meas_max_func(), 0) - - -class LongitudinalAccelSafetyTest(PandaSafetyTestBase, abc.ABC): - - LONGITUDINAL = True - MAX_ACCEL: float = 2.0 - MIN_ACCEL: float = -3.5 - INACTIVE_ACCEL: float = 0.0 - - @classmethod - def setUpClass(cls): - if cls.__name__ == "LongitudinalAccelSafetyTest": - cls.safety = None - raise unittest.SkipTest - - @abc.abstractmethod - def _accel_msg(self, accel: float): - pass - - def test_accel_limits_correct(self): - self.assertGreater(self.MAX_ACCEL, 0) - self.assertLess(self.MIN_ACCEL, 0) - - def test_accel_actuation_limits(self): - limits = ((self.MIN_ACCEL, self.MAX_ACCEL, ALTERNATIVE_EXPERIENCE.DEFAULT), - (self.MIN_ACCEL, self.MAX_ACCEL, ALTERNATIVE_EXPERIENCE.RAISE_LONGITUDINAL_LIMITS_TO_ISO_MAX)) - - for min_accel, max_accel, alternative_experience in limits: - # enforce we don't skip over 0 or inactive accel - for accel in np.concatenate((np.arange(min_accel - 1, max_accel + 1, 0.05), [0, self.INACTIVE_ACCEL])): - accel = round(accel, 2) # floats might not hit exact boundary conditions without rounding - for controls_allowed in [True, False]: - self.safety.set_controls_allowed(controls_allowed) - self.safety.set_alternative_experience(alternative_experience) - if self.LONGITUDINAL: - should_tx = controls_allowed and min_accel <= accel <= max_accel - should_tx = should_tx or accel == self.INACTIVE_ACCEL - else: - should_tx = False - self.assertEqual(should_tx, self._tx(self._accel_msg(accel))) - - -class LongitudinalGasBrakeSafetyTest(PandaSafetyTestBase, abc.ABC): - - MIN_BRAKE: int = 0 - MAX_BRAKE: int | None = None - MAX_POSSIBLE_BRAKE: int | None = None - - MIN_GAS: int = 0 - MAX_GAS: int | None = None - INACTIVE_GAS = 0 - MAX_POSSIBLE_GAS: int | None = None - - def test_gas_brake_limits_correct(self): - self.assertIsNotNone(self.MAX_POSSIBLE_BRAKE) - self.assertIsNotNone(self.MAX_POSSIBLE_GAS) - - self.assertGreater(self.MAX_BRAKE, self.MIN_BRAKE) - self.assertGreater(self.MAX_GAS, self.MIN_GAS) - - @abc.abstractmethod - def _send_gas_msg(self, gas: int): - pass - - @abc.abstractmethod - def _send_brake_msg(self, brake: int): - pass - - def test_brake_safety_check(self): - self._generic_limit_safety_check(self._send_brake_msg, self.MIN_BRAKE, self.MAX_BRAKE, 0, self.MAX_POSSIBLE_BRAKE, 1) - - def test_gas_safety_check(self): - self._generic_limit_safety_check(self._send_gas_msg, self.MIN_GAS, self.MAX_GAS, 0, self.MAX_POSSIBLE_GAS, 1, self.INACTIVE_GAS) - - -class TorqueSteeringSafetyTestBase(PandaSafetyTestBase, abc.ABC): - - MAX_RATE_UP = 0 - MAX_RATE_DOWN = 0 - MAX_TORQUE = 0 - MAX_RT_DELTA = 0 - RT_INTERVAL = 0 - - NO_STEER_REQ_BIT = False - - @classmethod - def setUpClass(cls): - if cls.__name__ == "TorqueSteeringSafetyTestBase": - cls.safety = None - raise unittest.SkipTest - - @abc.abstractmethod - def _torque_cmd_msg(self, torque, steer_req=1): - pass - - def _set_prev_torque(self, t): - self.safety.set_desired_torque_last(t) - self.safety.set_rt_torque_last(t) - - def test_steer_safety_check(self): - for enabled in [0, 1]: - for t in range(int(-self.MAX_TORQUE * 1.5), int(self.MAX_TORQUE * 1.5)): - self.safety.set_controls_allowed(enabled) - self._set_prev_torque(t) - if abs(t) > self.MAX_TORQUE or (not enabled and abs(t) > 0): - self.assertFalse(self._tx(self._torque_cmd_msg(t))) - else: - self.assertTrue(self._tx(self._torque_cmd_msg(t))) - - def test_non_realtime_limit_up(self): - self.safety.set_controls_allowed(True) - - self._set_prev_torque(0) - self.assertTrue(self._tx(self._torque_cmd_msg(self.MAX_RATE_UP))) - self._set_prev_torque(0) - self.assertTrue(self._tx(self._torque_cmd_msg(-self.MAX_RATE_UP))) - - self._set_prev_torque(0) - self.assertFalse(self._tx(self._torque_cmd_msg(self.MAX_RATE_UP + 1))) - self.safety.set_controls_allowed(True) - self._set_prev_torque(0) - self.assertFalse(self._tx(self._torque_cmd_msg(-self.MAX_RATE_UP - 1))) - - def test_steer_req_bit(self): - """Asserts all torque safety modes check the steering request bit""" - if self.NO_STEER_REQ_BIT: - raise unittest.SkipTest("No steering request bit") - - self.safety.set_controls_allowed(True) - self._set_prev_torque(self.MAX_TORQUE) - - # Send torque successfully, then only drop the request bit and ensure it stays blocked - for _ in range(10): - self.assertTrue(self._tx(self._torque_cmd_msg(self.MAX_TORQUE, 1))) - - self.assertFalse(self._tx(self._torque_cmd_msg(self.MAX_TORQUE, 0))) - for _ in range(10): - self.assertFalse(self._tx(self._torque_cmd_msg(self.MAX_TORQUE, 1))) - - -class SteerRequestCutSafetyTest(TorqueSteeringSafetyTestBase, abc.ABC): - - @classmethod - def setUpClass(cls): - if cls.__name__ == "SteerRequestCutSafetyTest": - cls.safety = None - raise unittest.SkipTest - - # Safety around steering request bit mismatch tolerance - MIN_VALID_STEERING_FRAMES: int - MAX_INVALID_STEERING_FRAMES: int - MIN_VALID_STEERING_RT_INTERVAL: int - - def test_steer_req_bit_frames(self): - """ - Certain safety modes implement some tolerance on their steer request bits matching the - requested torque to avoid a steering fault or lockout and maintain torque. This tests: - - We can't cut torque for more than one frame - - We can't cut torque until at least the minimum number of matching steer_req messages - - We can always recover from violations if steer_req=1 - """ - - for min_valid_steer_frames in range(self.MIN_VALID_STEERING_FRAMES * 2): - # Reset match count and rt timer to allow cut (valid_steer_req_count, ts_steer_req_mismatch_last) - self.safety.init_tests() - self.safety.set_timer(self.MIN_VALID_STEERING_RT_INTERVAL) - - # Allow torque cut - self.safety.set_controls_allowed(True) - self._set_prev_torque(self.MAX_TORQUE) - for _ in range(min_valid_steer_frames): - self.assertTrue(self._tx(self._torque_cmd_msg(self.MAX_TORQUE, steer_req=1))) - - # should tx if we've sent enough valid frames, and we're not cutting torque for too many frames consecutively - should_tx = min_valid_steer_frames >= self.MIN_VALID_STEERING_FRAMES - for idx in range(self.MAX_INVALID_STEERING_FRAMES * 2): - tx = self._tx(self._torque_cmd_msg(self.MAX_TORQUE, steer_req=0)) - self.assertEqual(should_tx and idx < self.MAX_INVALID_STEERING_FRAMES, tx) - - # Keep blocking after one steer_req mismatch - for _ in range(100): - self.assertFalse(self._tx(self._torque_cmd_msg(self.MAX_TORQUE, steer_req=0))) - - # Make sure we can recover - self.assertTrue(self._tx(self._torque_cmd_msg(0, steer_req=1))) - self._set_prev_torque(self.MAX_TORQUE) - self.assertTrue(self._tx(self._torque_cmd_msg(self.MAX_TORQUE, steer_req=1))) - - def test_steer_req_bit_multi_invalid(self): - """ - For safety modes allowing multiple consecutive invalid frames, this ensures that once a valid frame - is sent after an invalid frame (even without sending the max number of allowed invalid frames), - all counters are reset. - """ - for max_invalid_steer_frames in range(1, self.MAX_INVALID_STEERING_FRAMES * 2): - self.safety.init_tests() - self.safety.set_timer(self.MIN_VALID_STEERING_RT_INTERVAL) - - # Allow torque cut - self.safety.set_controls_allowed(True) - self._set_prev_torque(self.MAX_TORQUE) - for _ in range(self.MIN_VALID_STEERING_FRAMES): - self.assertTrue(self._tx(self._torque_cmd_msg(self.MAX_TORQUE, steer_req=1))) - - # Send partial amount of allowed invalid frames - for idx in range(max_invalid_steer_frames): - should_tx = idx < self.MAX_INVALID_STEERING_FRAMES - self.assertEqual(should_tx, self._tx(self._torque_cmd_msg(self.MAX_TORQUE, steer_req=0))) - - # Send one valid frame, and subsequent invalid should now be blocked - self._set_prev_torque(self.MAX_TORQUE) - self.assertTrue(self._tx(self._torque_cmd_msg(self.MAX_TORQUE, steer_req=1))) - for _ in range(self.MIN_VALID_STEERING_FRAMES + 1): - self.assertFalse(self._tx(self._torque_cmd_msg(self.MAX_TORQUE, steer_req=0))) - - def test_steer_req_bit_realtime(self): - """ - Realtime safety for cutting steer request bit. This tests: - - That we allow messages with mismatching steer request bit if time from last is >= MIN_VALID_STEERING_RT_INTERVAL - - That frame mismatch safety does not interfere with this test - """ - for rt_us in np.arange(self.MIN_VALID_STEERING_RT_INTERVAL - 50000, self.MIN_VALID_STEERING_RT_INTERVAL + 50000, 10000): - # Reset match count and rt timer (valid_steer_req_count, ts_steer_req_mismatch_last) - self.safety.init_tests() - - # Make sure valid_steer_req_count doesn't affect this test - self.safety.set_controls_allowed(True) - self._set_prev_torque(self.MAX_TORQUE) - for _ in range(self.MIN_VALID_STEERING_FRAMES): - self.assertTrue(self._tx(self._torque_cmd_msg(self.MAX_TORQUE, steer_req=1))) - - # Normally, sending MIN_VALID_STEERING_FRAMES valid frames should always allow - self.safety.set_timer(max(rt_us, 0)) - should_tx = rt_us >= self.MIN_VALID_STEERING_RT_INTERVAL - for _ in range(self.MAX_INVALID_STEERING_FRAMES): - self.assertEqual(should_tx, self._tx(self._torque_cmd_msg(self.MAX_TORQUE, steer_req=0))) - - # Keep blocking after one steer_req mismatch - for _ in range(100): - self.assertFalse(self._tx(self._torque_cmd_msg(self.MAX_TORQUE, steer_req=0))) - - # Make sure we can recover - self.assertTrue(self._tx(self._torque_cmd_msg(0, steer_req=1))) - self._set_prev_torque(self.MAX_TORQUE) - self.assertTrue(self._tx(self._torque_cmd_msg(self.MAX_TORQUE, steer_req=1))) - - -class DriverTorqueSteeringSafetyTest(TorqueSteeringSafetyTestBase, abc.ABC): - - DRIVER_TORQUE_ALLOWANCE = 0 - DRIVER_TORQUE_FACTOR = 0 - - @classmethod - def setUpClass(cls): - if cls.__name__ == "DriverTorqueSteeringSafetyTest": - cls.safety = None - raise unittest.SkipTest - - @abc.abstractmethod - def _torque_driver_msg(self, torque): - pass - - def _reset_torque_driver_measurement(self, torque): - for _ in range(MAX_SAMPLE_VALS): - self._rx(self._torque_driver_msg(torque)) - - def test_non_realtime_limit_up(self): - self._reset_torque_driver_measurement(0) - super().test_non_realtime_limit_up() - - def test_against_torque_driver(self): - # Tests down limits and driver torque blending - self.safety.set_controls_allowed(True) - - # Cannot stay at MAX_TORQUE if above DRIVER_TORQUE_ALLOWANCE - for sign in [-1, 1]: - for driver_torque in np.arange(0, self.DRIVER_TORQUE_ALLOWANCE * 2, 1): - self._reset_torque_driver_measurement(-driver_torque * sign) - self._set_prev_torque(self.MAX_TORQUE * sign) - should_tx = abs(driver_torque) <= self.DRIVER_TORQUE_ALLOWANCE - self.assertEqual(should_tx, self._tx(self._torque_cmd_msg(self.MAX_TORQUE * sign))) - - # arbitrary high driver torque to ensure max steer torque is allowed - max_driver_torque = int(self.MAX_TORQUE / self.DRIVER_TORQUE_FACTOR + self.DRIVER_TORQUE_ALLOWANCE + 1) - - # spot check some individual cases - for sign in [-1, 1]: - # Ensure we wind down factor units for every unit above allowance - driver_torque = (self.DRIVER_TORQUE_ALLOWANCE + 10) * sign - torque_desired = (self.MAX_TORQUE - 10 * self.DRIVER_TORQUE_FACTOR) * sign - delta = 1 * sign - self._set_prev_torque(torque_desired) - self._reset_torque_driver_measurement(-driver_torque) - self.assertTrue(self._tx(self._torque_cmd_msg(torque_desired))) - self._set_prev_torque(torque_desired + delta) - self._reset_torque_driver_measurement(-driver_torque) - self.assertFalse(self._tx(self._torque_cmd_msg(torque_desired + delta))) - - # If we're well past the allowance, minimum wind down is MAX_RATE_DOWN - self._set_prev_torque(self.MAX_TORQUE * sign) - self._reset_torque_driver_measurement(-max_driver_torque * sign) - self.assertTrue(self._tx(self._torque_cmd_msg((self.MAX_TORQUE - self.MAX_RATE_DOWN) * sign))) - self._set_prev_torque(self.MAX_TORQUE * sign) - self._reset_torque_driver_measurement(-max_driver_torque * sign) - self.assertTrue(self._tx(self._torque_cmd_msg(0))) - self._set_prev_torque(self.MAX_TORQUE * sign) - self._reset_torque_driver_measurement(-max_driver_torque * sign) - self.assertFalse(self._tx(self._torque_cmd_msg((self.MAX_TORQUE - self.MAX_RATE_DOWN + 1) * sign))) - - def test_realtime_limits(self): - self.safety.set_controls_allowed(True) - - for sign in [-1, 1]: - self.safety.init_tests() - self._set_prev_torque(0) - self._reset_torque_driver_measurement(0) - for t in np.arange(0, self.MAX_RT_DELTA, 1): - t *= sign - self.assertTrue(self._tx(self._torque_cmd_msg(t))) - self.assertFalse(self._tx(self._torque_cmd_msg(sign * (self.MAX_RT_DELTA + 1)))) - - self._set_prev_torque(0) - for t in np.arange(0, self.MAX_RT_DELTA, 1): - t *= sign - self.assertTrue(self._tx(self._torque_cmd_msg(t))) - - # Increase timer to update rt_torque_last - self.safety.set_timer(self.RT_INTERVAL + 1) - self.assertTrue(self._tx(self._torque_cmd_msg(sign * (self.MAX_RT_DELTA - 1)))) - self.assertTrue(self._tx(self._torque_cmd_msg(sign * (self.MAX_RT_DELTA + 1)))) - - def test_reset_driver_torque_measurements(self): - # Tests that the driver torque measurement sample_t is reset on safety mode init - for t in np.linspace(-self.MAX_TORQUE, self.MAX_TORQUE, MAX_SAMPLE_VALS): - self.assertTrue(self._rx(self._torque_driver_msg(t))) - - self.assertNotEqual(self.safety.get_torque_driver_min(), 0) - self.assertNotEqual(self.safety.get_torque_driver_max(), 0) - - self._reset_safety_hooks() - self.assertEqual(self.safety.get_torque_driver_min(), 0) - self.assertEqual(self.safety.get_torque_driver_max(), 0) - - -class MotorTorqueSteeringSafetyTest(TorqueSteeringSafetyTestBase, abc.ABC): - - MAX_TORQUE_ERROR = 0 - TORQUE_MEAS_TOLERANCE = 0 - - @classmethod - def setUpClass(cls): - if cls.__name__ == "MotorTorqueSteeringSafetyTest": - cls.safety = None - raise unittest.SkipTest - - @abc.abstractmethod - def _torque_meas_msg(self, torque): - pass - - def _set_prev_torque(self, t): - super()._set_prev_torque(t) - self.safety.set_torque_meas(t, t) - - def test_torque_absolute_limits(self): - for controls_allowed in [True, False]: - for torque in np.arange(-self.MAX_TORQUE - 1000, self.MAX_TORQUE + 1000, self.MAX_RATE_UP): - self.safety.set_controls_allowed(controls_allowed) - self.safety.set_rt_torque_last(torque) - self.safety.set_torque_meas(torque, torque) - self.safety.set_desired_torque_last(torque - self.MAX_RATE_UP) - - if controls_allowed: - send = (-self.MAX_TORQUE <= torque <= self.MAX_TORQUE) - else: - send = torque == 0 - - self.assertEqual(send, self._tx(self._torque_cmd_msg(torque))) - - def test_non_realtime_limit_down(self): - self.safety.set_controls_allowed(True) - - torque_meas = self.MAX_TORQUE - self.MAX_TORQUE_ERROR - 50 - - self.safety.set_rt_torque_last(self.MAX_TORQUE) - self.safety.set_torque_meas(torque_meas, torque_meas) - self.safety.set_desired_torque_last(self.MAX_TORQUE) - self.assertTrue(self._tx(self._torque_cmd_msg(self.MAX_TORQUE - self.MAX_RATE_DOWN))) - - self.safety.set_rt_torque_last(self.MAX_TORQUE) - self.safety.set_torque_meas(torque_meas, torque_meas) - self.safety.set_desired_torque_last(self.MAX_TORQUE) - self.assertFalse(self._tx(self._torque_cmd_msg(self.MAX_TORQUE - self.MAX_RATE_DOWN + 1))) - - def test_exceed_torque_sensor(self): - self.safety.set_controls_allowed(True) - - for sign in [-1, 1]: - self._set_prev_torque(0) - for t in np.arange(0, self.MAX_TORQUE_ERROR + 2, 2): # step needs to be smaller than MAX_TORQUE_ERROR - t *= sign - self.assertTrue(self._tx(self._torque_cmd_msg(t))) - - self.assertFalse(self._tx(self._torque_cmd_msg(sign * (self.MAX_TORQUE_ERROR + 2)))) - - def test_realtime_limit_up(self): - self.safety.set_controls_allowed(True) - - for sign in [-1, 1]: - self.safety.init_tests() - self._set_prev_torque(0) - for t in np.arange(0, self.MAX_RT_DELTA + 1, 1): - t *= sign - self.safety.set_torque_meas(t, t) - self.assertTrue(self._tx(self._torque_cmd_msg(t))) - self.assertFalse(self._tx(self._torque_cmd_msg(sign * (self.MAX_RT_DELTA + 1)))) - - self._set_prev_torque(0) - for t in np.arange(0, self.MAX_RT_DELTA + 1, 1): - t *= sign - self.safety.set_torque_meas(t, t) - self.assertTrue(self._tx(self._torque_cmd_msg(t))) - - # Increase timer to update rt_torque_last - self.safety.set_timer(self.RT_INTERVAL + 1) - self.assertTrue(self._tx(self._torque_cmd_msg(sign * self.MAX_RT_DELTA))) - self.assertTrue(self._tx(self._torque_cmd_msg(sign * (self.MAX_RT_DELTA + 1)))) - - def test_torque_measurements(self): - trq = 50 - for t in [trq, -trq, 0, 0, 0, 0]: - self._rx(self._torque_meas_msg(t)) - - max_range = range(trq, trq + self.TORQUE_MEAS_TOLERANCE + 1) - min_range = range(-(trq + self.TORQUE_MEAS_TOLERANCE), -trq + 1) - self.assertTrue(self.safety.get_torque_meas_min() in min_range) - self.assertTrue(self.safety.get_torque_meas_max() in max_range) - - max_range = range(self.TORQUE_MEAS_TOLERANCE + 1) - min_range = range(-(trq + self.TORQUE_MEAS_TOLERANCE), -trq + 1) - self._rx(self._torque_meas_msg(0)) - self.assertTrue(self.safety.get_torque_meas_min() in min_range) - self.assertTrue(self.safety.get_torque_meas_max() in max_range) - - max_range = range(self.TORQUE_MEAS_TOLERANCE + 1) - min_range = range(-self.TORQUE_MEAS_TOLERANCE, 0 + 1) - self._rx(self._torque_meas_msg(0)) - self.assertTrue(self.safety.get_torque_meas_min() in min_range) - self.assertTrue(self.safety.get_torque_meas_max() in max_range) - - def test_reset_torque_measurements(self): - # Tests that the torque measurement sample_t is reset on safety mode init - for t in np.linspace(-self.MAX_TORQUE, self.MAX_TORQUE, MAX_SAMPLE_VALS): - self.assertTrue(self._rx(self._torque_meas_msg(t))) - - self.assertNotEqual(self.safety.get_torque_meas_min(), 0) - self.assertNotEqual(self.safety.get_torque_meas_max(), 0) - - self._reset_safety_hooks() - self.assertEqual(self.safety.get_torque_meas_min(), 0) - self.assertEqual(self.safety.get_torque_meas_max(), 0) - - -class AngleSteeringSafetyTest(PandaSafetyTestBase): - - STEER_ANGLE_MAX: float = 300 - DEG_TO_CAN: float - ANGLE_RATE_BP: list[float] - ANGLE_RATE_UP: list[float] # windup limit - ANGLE_RATE_DOWN: list[float] # unwind limit - - @classmethod - def setUpClass(cls): - if cls.__name__ == "AngleSteeringSafetyTest": - cls.safety = None - raise unittest.SkipTest - - @abc.abstractmethod - def _speed_msg(self, speed): - pass - - @abc.abstractmethod - def _angle_cmd_msg(self, angle: float, enabled: bool): - pass - - @abc.abstractmethod - def _angle_meas_msg(self, angle: float): - pass - - def _set_prev_desired_angle(self, t): - t = round(t * self.DEG_TO_CAN) - self.safety.set_desired_angle_last(t) - - def _reset_angle_measurement(self, angle): - for _ in range(MAX_SAMPLE_VALS): - self._rx(self._angle_meas_msg(angle)) - - def _reset_speed_measurement(self, speed): - for _ in range(MAX_SAMPLE_VALS): - self._rx(self._speed_msg(speed)) - - def test_vehicle_speed_measurements(self): - # TODO: lower tolerance on these tests - self._common_measurement_test(self._speed_msg, 0, 80, 1, self.safety.get_vehicle_speed_min, self.safety.get_vehicle_speed_max) - - def test_steering_angle_measurements(self): - self._common_measurement_test(self._angle_meas_msg, -self.STEER_ANGLE_MAX, self.STEER_ANGLE_MAX, self.DEG_TO_CAN, - self.safety.get_angle_meas_min, self.safety.get_angle_meas_max) - - def test_angle_cmd_when_enabled(self): - # when controls are allowed, angle cmd rate limit is enforced - speeds = [0., 1., 5., 10., 15., 50.] - angles = np.concatenate((np.arange(-self.STEER_ANGLE_MAX * 2, self.STEER_ANGLE_MAX * 2, 5), [0])) - for a in angles: - for s in speeds: - max_delta_up = np.interp(s, self.ANGLE_RATE_BP, self.ANGLE_RATE_UP) - max_delta_down = np.interp(s, self.ANGLE_RATE_BP, self.ANGLE_RATE_DOWN) - - # first test against false positives - self._reset_angle_measurement(a) - self._reset_speed_measurement(s) - - self._set_prev_desired_angle(a) - self.safety.set_controls_allowed(1) - - # Stay within limits - # Up - self.assertTrue(self._tx(self._angle_cmd_msg(a + sign_of(a) * max_delta_up, True))) - self.assertTrue(self.safety.get_controls_allowed()) - - # Don't change - self.assertTrue(self._tx(self._angle_cmd_msg(a, True))) - self.assertTrue(self.safety.get_controls_allowed()) - - # Down - self.assertTrue(self._tx(self._angle_cmd_msg(a - sign_of(a) * max_delta_down, True))) - self.assertTrue(self.safety.get_controls_allowed()) - - # Inject too high rates - # Up - self.assertFalse(self._tx(self._angle_cmd_msg(a + sign_of(a) * (max_delta_up + 1.1), True))) - - # Don't change - self.safety.set_controls_allowed(1) - self._set_prev_desired_angle(a) - self.assertTrue(self.safety.get_controls_allowed()) - self.assertTrue(self._tx(self._angle_cmd_msg(a, True))) - self.assertTrue(self.safety.get_controls_allowed()) - - # Down - self.assertFalse(self._tx(self._angle_cmd_msg(a - sign_of(a) * (max_delta_down + 1.1), True))) - - # Check desired steer should be the same as steer angle when controls are off - self.safety.set_controls_allowed(0) - should_tx = abs(a) <= abs(self.STEER_ANGLE_MAX) - self.assertEqual(should_tx, self._tx(self._angle_cmd_msg(a, False))) - - def test_angle_cmd_when_disabled(self): - # Tests that only angles close to the meas are allowed while - # steer actuation bit is 0, regardless of controls allowed. - for controls_allowed in (True, False): - self.safety.set_controls_allowed(controls_allowed) - - for steer_control_enabled in (True, False): - for angle_meas in np.arange(-90, 91, 10): - self._reset_angle_measurement(angle_meas) - - for angle_cmd in np.arange(-90, 91, 10): - self._set_prev_desired_angle(angle_cmd) - - # controls_allowed is checked if actuation bit is 1, else the angle must be close to meas (inactive) - should_tx = controls_allowed if steer_control_enabled else angle_cmd == angle_meas - self.assertEqual(should_tx, self._tx(self._angle_cmd_msg(angle_cmd, steer_control_enabled))) - - -class PandaSafetyTest(PandaSafetyTestBase): - TX_MSGS: list[list[int]] | None = None - SCANNED_ADDRS = [*range(0x800), # Entire 11-bit CAN address space - *range(0x18DA00F1, 0x18DB00F1, 0x100), # 29-bit UDS physical addressing - *range(0x18DB00F1, 0x18DC00F1, 0x100), # 29-bit UDS functional addressing - *range(0x3300, 0x3400)] # Honda - FWD_BLACKLISTED_ADDRS: dict[int, list[int]] = {} # {bus: [addr]} - FWD_BUS_LOOKUP: dict[int, int] = {0: 2, 2: 0} - - @classmethod - def setUpClass(cls): - if cls.__name__ == "PandaSafetyTest" or cls.__name__.endswith('Base'): - cls.safety = None - raise unittest.SkipTest - - # ***** standard tests for all safety modes ***** - - def test_tx_msg_in_scanned_range(self): - # the relay malfunction, fwd hook, and spam can tests don't exhaustively - # scan the entire 29-bit address space, only some known important ranges - # make sure SCANNED_ADDRS stays up to date with car port TX_MSGS; new - # model ports should expand the range if needed - for msg in self.TX_MSGS: - self.assertTrue(msg[0] in self.SCANNED_ADDRS, f"{msg[0]=:#x}") - - def test_fwd_hook(self): - # some safety modes don't forward anything, while others blacklist msgs - for bus in range(3): - for addr in self.SCANNED_ADDRS: - # assume len 8 - fwd_bus = self.FWD_BUS_LOOKUP.get(bus, -1) - if bus in self.FWD_BLACKLISTED_ADDRS and addr in self.FWD_BLACKLISTED_ADDRS[bus]: - fwd_bus = -1 - self.assertEqual(fwd_bus, self.safety.safety_fwd_hook(bus, addr), f"{addr=:#x} from {bus=} to {fwd_bus=}") - - def test_spam_can_buses(self): - for bus in range(4): - for addr in self.SCANNED_ADDRS: - if [addr, bus] not in self.TX_MSGS: - self.assertFalse(self._tx(make_msg(bus, addr, 8)), f"allowed TX {addr=} {bus=}") - - def test_default_controls_not_allowed(self): - self.assertFalse(self.safety.get_controls_allowed()) - - def test_manually_enable_controls_allowed(self): - self.safety.set_controls_allowed(1) - self.assertTrue(self.safety.get_controls_allowed()) - self.safety.set_controls_allowed(0) - self.assertFalse(self.safety.get_controls_allowed()) - - def test_tx_hook_on_wrong_safety_mode(self): - files = os.listdir(os.path.dirname(os.path.realpath(__file__))) - test_files = [f for f in files if f.startswith("test_") and f.endswith(".py")] - - current_test = self.__class__.__name__ - - all_tx = [] - for tf in test_files: - test = importlib.import_module("opendbc.safety.tests."+tf[:-3]) - for attr in dir(test): - if attr.startswith("Test") and attr != current_test: - tc = getattr(test, attr) - tx = tc.TX_MSGS - if tx is not None and not attr.endswith('Base'): - # No point in comparing different Tesla safety modes - if 'Tesla' in attr and 'Tesla' in current_test: - continue - # No point in comparing to ALLOUTPUT which allows all messages - if attr.startswith('TestAllOutput'): - continue - if attr.startswith('TestToyota') and current_test.startswith('TestToyota'): - continue - if attr.startswith('TestSubaruGen') and current_test.startswith('TestSubaruGen'): - continue - if attr.startswith('TestSubaruPreglobal') and current_test.startswith('TestSubaruPreglobal'): - continue - if {attr, current_test}.issubset({'TestVolkswagenPqSafety', 'TestVolkswagenPqStockSafety', 'TestVolkswagenPqLongSafety'}): - continue - if {attr, current_test}.issubset({'TestGmCameraSafety', 'TestGmCameraLongitudinalSafety'}): - continue - if attr.startswith('TestFord') and current_test.startswith('TestFord'): - continue - if attr.startswith('TestHyundaiCanfd') and current_test.startswith('TestHyundaiCanfd'): - continue - if {attr, current_test}.issubset({'TestVolkswagenMqbSafety', 'TestVolkswagenMqbStockSafety', 'TestVolkswagenMqbLongSafety'}): - continue - - # overlapping TX addrs, but they're not actuating messages for either car - if attr == 'TestHyundaiCanfdLKASteeringLongEV' and current_test.startswith('TestToyota'): - tx = list(filter(lambda m: m[0] not in [0x160, ], tx)) - - # Volkswagen MQB longitudinal actuating message overlaps with the Subaru lateral actuating message - if attr == 'TestVolkswagenMqbLongSafety' and current_test.startswith('TestSubaru'): - tx = list(filter(lambda m: m[0] not in [0x122, ], tx)) - - # Volkswagen MQB and Honda Nidec ACC HUD messages overlap - if attr == 'TestVolkswagenMqbLongSafety' and current_test.startswith('TestHondaNidec'): - tx = list(filter(lambda m: m[0] not in [0x30c, ], tx)) - - # Volkswagen MQB and Honda Bosch Radarless ACC HUD messages overlap - if attr == 'TestVolkswagenMqbLongSafety' and current_test.startswith('TestHondaBoschRadarless'): - tx = list(filter(lambda m: m[0] not in [0x30c, ], tx)) - - # TODO: Temporary, should be fixed in panda firmware, safety_honda.h - if attr.startswith('TestHonda'): - # exceptions for common msgs across different hondas - tx = list(filter(lambda m: m[0] not in [0x1FA, 0x30C, 0x33D, 0x33DB], tx)) - - if attr.startswith('TestHyundaiLongitudinal'): - # exceptions for common msgs across different Hyundai CAN platforms - tx = list(filter(lambda m: m[0] not in [0x420, 0x50A, 0x389, 0x4A2], tx)) - all_tx.append([[m[0], m[1], attr] for m in tx]) - - # make sure we got all the msgs - self.assertTrue(len(all_tx) >= len(test_files)-1) - - for tx_msgs in all_tx: - for addr, bus, test_name in tx_msgs: - msg = make_msg(bus, addr) - self.safety.set_controls_allowed(1) - # TODO: this should be blocked - if current_test in ["TestNissanSafety", "TestNissanSafetyAltEpsBus", "TestNissanLeafSafety"] and [addr, bus] in self.TX_MSGS: - continue - self.assertFalse(self._tx(msg), f"transmit of {addr=:#x} {bus=} from {test_name} during {current_test} was allowed") - - -@add_regen_tests -class PandaCarSafetyTest(PandaSafetyTest): - STANDSTILL_THRESHOLD: float = 0.0 - GAS_PRESSED_THRESHOLD = 0 - RELAY_MALFUNCTION_ADDRS: dict[int, tuple[int, ...]] | None = None - - @classmethod - def setUpClass(cls): - if cls.__name__ == "PandaCarSafetyTest" or cls.__name__.endswith('Base'): - cls.safety = None - raise unittest.SkipTest - - @abc.abstractmethod - def _user_brake_msg(self, brake): - pass - - def _user_regen_msg(self, regen): - pass - - @abc.abstractmethod - def _speed_msg(self, speed): - pass - - # Safety modes can override if vehicle_moving is driven by a different message - def _vehicle_moving_msg(self, speed: float): - return self._speed_msg(speed) - - @abc.abstractmethod - def _user_gas_msg(self, gas): - pass - - @abc.abstractmethod - def _pcm_status_msg(self, enable): - pass - - # ***** standard tests for all car-specific safety modes ***** - - def test_relay_malfunction(self): - # each car has an addr that is used to detect relay malfunction - # if that addr is seen on specified bus, triggers the relay malfunction - # protection logic: both tx_hook and fwd_hook are expected to return failure - self.assertFalse(self.safety.get_relay_malfunction()) - for bus in range(3): - for addr in self.SCANNED_ADDRS: - self.safety.set_relay_malfunction(False) - self._rx(make_msg(bus, addr, 8)) - should_relay_malfunction = addr in self.RELAY_MALFUNCTION_ADDRS.get(bus, ()) - self.assertEqual(should_relay_malfunction, self.safety.get_relay_malfunction(), (bus, addr)) - - # test relay malfunction protection logic - self.safety.set_relay_malfunction(True) - for bus in range(3): - for addr in self.SCANNED_ADDRS: - self.assertFalse(self._tx(make_msg(bus, addr, 8))) - self.assertEqual(-1, self.safety.safety_fwd_hook(bus, addr)) - - def test_prev_gas(self): - self.assertFalse(self.safety.get_gas_pressed_prev()) - for pressed in [self.GAS_PRESSED_THRESHOLD + 1, 0]: - self._rx(self._user_gas_msg(pressed)) - self.assertEqual(bool(pressed), self.safety.get_gas_pressed_prev()) - - def test_allow_engage_with_gas_pressed(self): - self._rx(self._user_gas_msg(1)) - self.safety.set_controls_allowed(True) - self._rx(self._user_gas_msg(1)) - self.assertTrue(self.safety.get_controls_allowed()) - self._rx(self._user_gas_msg(1)) - self.assertTrue(self.safety.get_controls_allowed()) - - def test_disengage_on_gas(self): - self._rx(self._user_gas_msg(0)) - self.safety.set_controls_allowed(True) - self._rx(self._user_gas_msg(self.GAS_PRESSED_THRESHOLD + 1)) - self.assertFalse(self.safety.get_controls_allowed()) - - def test_alternative_experience_no_disengage_on_gas(self): - self._rx(self._user_gas_msg(0)) - self.safety.set_controls_allowed(True) - self.safety.set_alternative_experience(ALTERNATIVE_EXPERIENCE.DISABLE_DISENGAGE_ON_GAS) - self._rx(self._user_gas_msg(self.GAS_PRESSED_THRESHOLD + 1)) - # Test we allow lateral, but not longitudinal - self.assertTrue(self.safety.get_controls_allowed()) - self.assertFalse(self.safety.get_longitudinal_allowed()) - # Make sure we can re-gain longitudinal actuation - self._rx(self._user_gas_msg(0)) - self.assertTrue(self.safety.get_longitudinal_allowed()) - - def test_prev_user_brake(self, _user_brake_msg=None, get_brake_pressed_prev=None): - if _user_brake_msg is None: - _user_brake_msg = self._user_brake_msg - get_brake_pressed_prev = self.safety.get_brake_pressed_prev - - self.assertFalse(get_brake_pressed_prev()) - for pressed in [True, False]: - self._rx(_user_brake_msg(not pressed)) - self.assertEqual(not pressed, get_brake_pressed_prev()) - self._rx(_user_brake_msg(pressed)) - self.assertEqual(pressed, get_brake_pressed_prev()) - - def test_enable_control_allowed_from_cruise(self): - self._rx(self._pcm_status_msg(False)) - self.assertFalse(self.safety.get_controls_allowed()) - self._rx(self._pcm_status_msg(True)) - self.assertTrue(self.safety.get_controls_allowed()) - - def test_disable_control_allowed_from_cruise(self): - self.safety.set_controls_allowed(1) - self._rx(self._pcm_status_msg(False)) - self.assertFalse(self.safety.get_controls_allowed()) - - def test_cruise_engaged_prev(self): - for engaged in [True, False]: - self._rx(self._pcm_status_msg(engaged)) - self.assertEqual(engaged, self.safety.get_cruise_engaged_prev()) - self._rx(self._pcm_status_msg(not engaged)) - self.assertEqual(not engaged, self.safety.get_cruise_engaged_prev()) - - def test_allow_user_brake_at_zero_speed(self, _user_brake_msg=None, get_brake_pressed_prev=None): - if _user_brake_msg is None: - _user_brake_msg = self._user_brake_msg - - # Brake was already pressed - self._rx(self._vehicle_moving_msg(0)) - self._rx(_user_brake_msg(1)) - self.safety.set_controls_allowed(1) - self._rx(_user_brake_msg(1)) - self.assertTrue(self.safety.get_controls_allowed()) - self.assertTrue(self.safety.get_longitudinal_allowed()) - self._rx(_user_brake_msg(0)) - self.assertTrue(self.safety.get_controls_allowed()) - self.assertTrue(self.safety.get_longitudinal_allowed()) - # rising edge of brake should disengage - self._rx(_user_brake_msg(1)) - self.assertFalse(self.safety.get_controls_allowed()) - self.assertFalse(self.safety.get_longitudinal_allowed()) - self._rx(_user_brake_msg(0)) # reset no brakes - - def test_not_allow_user_brake_when_moving(self, _user_brake_msg=None, get_brake_pressed_prev=None): - if _user_brake_msg is None: - _user_brake_msg = self._user_brake_msg - - # Brake was already pressed - self._rx(_user_brake_msg(1)) - self.safety.set_controls_allowed(1) - self._rx(self._vehicle_moving_msg(self.STANDSTILL_THRESHOLD)) - self._rx(_user_brake_msg(1)) - self.assertTrue(self.safety.get_controls_allowed()) - self.assertTrue(self.safety.get_longitudinal_allowed()) - self._rx(self._vehicle_moving_msg(self.STANDSTILL_THRESHOLD + 1)) - self._rx(_user_brake_msg(1)) - self.assertFalse(self.safety.get_controls_allowed()) - self.assertFalse(self.safety.get_longitudinal_allowed()) - self._rx(self._vehicle_moving_msg(0)) - - def test_vehicle_moving(self): - self.assertFalse(self.safety.get_vehicle_moving()) - - # not moving - self._rx(self._vehicle_moving_msg(0)) - self.assertFalse(self.safety.get_vehicle_moving()) - - # speed is at threshold - self._rx(self._vehicle_moving_msg(self.STANDSTILL_THRESHOLD)) - self.assertFalse(self.safety.get_vehicle_moving()) - - # past threshold - self._rx(self._vehicle_moving_msg(self.STANDSTILL_THRESHOLD + 1)) - self.assertTrue(self.safety.get_vehicle_moving()) - - def test_safety_tick(self): - self.safety.set_timer(int(2e6)) - self.safety.set_controls_allowed(True) - self.safety.safety_tick_current_safety_config() - self.assertFalse(self.safety.get_controls_allowed()) - self.assertFalse(self.safety.safety_config_valid()) diff --git a/opendbc/safety/tests/hyundai_common.py b/opendbc/safety/tests/hyundai_common.py deleted file mode 100644 index 354c781e91f..00000000000 --- a/opendbc/safety/tests/hyundai_common.py +++ /dev/null @@ -1,155 +0,0 @@ -import unittest - -import opendbc.safety.tests.common as common -from opendbc.safety.tests.libsafety import libsafety_py -from opendbc.safety.tests.common import make_msg - - -class Buttons: - NONE = 0 - RESUME = 1 - SET = 2 - CANCEL = 4 - - -PREV_BUTTON_SAMPLES = 8 -ENABLE_BUTTONS = (Buttons.RESUME, Buttons.SET, Buttons.CANCEL) - - -class HyundaiButtonBase: - # pylint: disable=no-member,abstract-method - BUTTONS_TX_BUS = 0 # tx on this bus, rx on 0 - SCC_BUS = 0 # rx on this bus - - def test_button_sends(self): - """ - Only RES and CANCEL buttons are allowed - - RES allowed while controls allowed - - CANCEL allowed while cruise is enabled - """ - self.safety.set_controls_allowed(0) - self.assertFalse(self._tx(self._button_msg(Buttons.RESUME, bus=self.BUTTONS_TX_BUS))) - self.assertFalse(self._tx(self._button_msg(Buttons.SET, bus=self.BUTTONS_TX_BUS))) - - self.safety.set_controls_allowed(1) - self.assertTrue(self._tx(self._button_msg(Buttons.RESUME, bus=self.BUTTONS_TX_BUS))) - self.assertFalse(self._tx(self._button_msg(Buttons.SET, bus=self.BUTTONS_TX_BUS))) - - for enabled in (True, False): - self._rx(self._pcm_status_msg(enabled)) - self.assertEqual(enabled, self._tx(self._button_msg(Buttons.CANCEL, bus=self.BUTTONS_TX_BUS))) - - def test_enable_control_allowed_from_cruise(self): - """ - Hyundai non-longitudinal only enables on PCM rising edge and recent button press. Tests PCM enabling with: - - disallowed: No buttons - - disallowed: Buttons that don't enable cruise - - allowed: Buttons that do enable cruise - - allowed: Main button with all above combinations - """ - for main_button in (0, 1): - for btn in range(8): - for _ in range(PREV_BUTTON_SAMPLES): # reset - self._rx(self._button_msg(Buttons.NONE)) - - self._rx(self._pcm_status_msg(False)) - self.assertFalse(self.safety.get_controls_allowed()) - self._rx(self._button_msg(btn, main_button=main_button)) - self._rx(self._pcm_status_msg(True)) - controls_allowed = btn in ENABLE_BUTTONS or main_button - self.assertEqual(controls_allowed, self.safety.get_controls_allowed()) - - def test_sampling_cruise_buttons(self): - """ - Test that we allow controls on recent button press, but not as button leaves sliding window - """ - self._rx(self._button_msg(Buttons.SET)) - for i in range(2 * PREV_BUTTON_SAMPLES): - self._rx(self._pcm_status_msg(False)) - self.assertFalse(self.safety.get_controls_allowed()) - self._rx(self._pcm_status_msg(True)) - controls_allowed = i < PREV_BUTTON_SAMPLES - self.assertEqual(controls_allowed, self.safety.get_controls_allowed()) - self._rx(self._button_msg(Buttons.NONE)) - - -class HyundaiLongitudinalBase(common.LongitudinalAccelSafetyTest): - # pylint: disable=no-member,abstract-method - - DISABLED_ECU_UDS_MSG: tuple[int, int] - DISABLED_ECU_ACTUATION_MSG: tuple[int, int] - - @classmethod - def setUpClass(cls): - if cls.__name__ == "HyundaiLongitudinalBase": - cls.safety = None - raise unittest.SkipTest - - # override these tests from PandaCarSafetyTest, hyundai longitudinal uses button enable - def test_disable_control_allowed_from_cruise(self): - pass - - def test_enable_control_allowed_from_cruise(self): - pass - - def test_sampling_cruise_buttons(self): - pass - - def test_cruise_engaged_prev(self): - pass - - def test_button_sends(self): - pass - - def _pcm_status_msg(self, enable): - raise Exception - - def _accel_msg(self, accel, aeb_req=False, aeb_decel=0): - raise NotImplementedError - - def test_set_resume_buttons(self): - """ - SET and RESUME enter controls allowed on their falling edge. - """ - for btn_prev in range(8): - for btn_cur in range(8): - self._rx(self._button_msg(Buttons.NONE)) - self.safety.set_controls_allowed(0) - for _ in range(10): - self._rx(self._button_msg(btn_prev)) - self.assertFalse(self.safety.get_controls_allowed()) - - # should enter controls allowed on falling edge and not transitioning to cancel - should_enable = btn_cur != btn_prev and \ - btn_cur != Buttons.CANCEL and \ - btn_prev in (Buttons.RESUME, Buttons.SET) - - self._rx(self._button_msg(btn_cur)) - self.assertEqual(should_enable, self.safety.get_controls_allowed()) - - def test_cancel_button(self): - self.safety.set_controls_allowed(1) - self._rx(self._button_msg(Buttons.CANCEL)) - self.assertFalse(self.safety.get_controls_allowed()) - - def test_tester_present_allowed(self, ecu_disable: bool = True): - """ - Ensure tester present diagnostic message is allowed to keep ECU knocked out - for longitudinal control. - """ - - addr, bus = self.DISABLED_ECU_UDS_MSG - for should_tx, msg in ((True, b"\x02\x3E\x80\x00\x00\x00\x00\x00"), - (False, b"\x03\xAA\xAA\x00\x00\x00\x00\x00")): - tester_present = libsafety_py.make_CANPacket(addr, bus, msg) - self.assertEqual(should_tx and ecu_disable, self._tx(tester_present)) - - def test_disabled_ecu_alive(self): - """ - If the ECU knockout failed, make sure the relay malfunction is shown - """ - - addr, bus = self.DISABLED_ECU_ACTUATION_MSG - self.assertFalse(self.safety.get_relay_malfunction()) - self._rx(make_msg(bus, addr, 8)) - self.assertTrue(self.safety.get_relay_malfunction()) diff --git a/opendbc/safety/tests/install_mull.sh b/opendbc/safety/tests/install_mull.sh deleted file mode 100755 index 75b1042ec30..00000000000 --- a/opendbc/safety/tests/install_mull.sh +++ /dev/null @@ -1,11 +0,0 @@ -#!/usr/bin/env bash -set -e - -DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null && pwd)" -cd $DIR - -if ! command -v "mull-runner-17" > /dev/null 2>&1; then - sudo apt-get update && sudo apt-get install -y curl clang-17 - curl -1sLf 'https://dl.cloudsmith.io/public/mull-project/mull-stable/setup.deb.sh' | sudo -E bash - sudo apt-get update && sudo apt-get install -y mull-17 -fi diff --git a/opendbc/safety/tests/libsafety/SConscript b/opendbc/safety/tests/libsafety/SConscript deleted file mode 100644 index 0582e5c2567..00000000000 --- a/opendbc/safety/tests/libsafety/SConscript +++ /dev/null @@ -1,56 +0,0 @@ -import platform - -CC = 'gcc' -system = platform.system() -if system == 'Darwin': - # gcc installed by homebrew has version suffix (e.g. gcc-12) in order to be - # distinguishable from system one - which acts as a symlink to clang - CC += '-13' - -env = Environment( - CC=CC, - CFLAGS=[ - '-Wall', - '-Werror', - '-nostdlib', - '-fno-builtin', - '-std=gnu11', - '-Wfatal-errors', - '-Wno-pointer-to-int-cast', - ], - CPPPATH=[".", "../../board/", "../../"], -) -if system == "Darwin": - env.PrependENVPath('PATH', '/opt/homebrew/bin') - -if GetOption('mutation'): - env['CC'] = 'clang-17' - flags = [ - '-fprofile-instr-generate', - '-fcoverage-mapping', - '-fpass-plugin=/usr/lib/mull-ir-frontend-17', - '-g', - '-grecord-command-line', - ] - env['CFLAGS'] += flags - env['LINKFLAGS'] += flags - -if GetOption('ubsan'): - flags = [ - "-fsanitize=undefined", - "-fno-sanitize-recover=undefined", - ] - env['CFLAGS'] += flags - env['LINKFLAGS'] += flags - -safety = env.SharedObject("safety.os", "safety.c") -libsafety = env.SharedLibrary("libsafety.so", [safety]) - -if GetOption('coverage'): - env.Append( - CFLAGS=["-fprofile-arcs", "-ftest-coverage", "-fprofile-abs-path",], - LIBS=["gcov"], - ) - # GCC note file is generated by compiler, ensure we build it, and allow scons to clean it up - AlwaysBuild(safety) - env.SideEffect("safety.gcno", safety) diff --git a/opendbc/safety/tests/libsafety/__init__.py b/opendbc/safety/tests/libsafety/__init__.py deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/opendbc/safety/tests/libsafety/libsafety_py.py b/opendbc/safety/tests/libsafety/libsafety_py.py deleted file mode 100644 index e851c6bca80..00000000000 --- a/opendbc/safety/tests/libsafety/libsafety_py.py +++ /dev/null @@ -1,75 +0,0 @@ -import os -from cffi import FFI -from typing import Protocol - -from opendbc.safety import LEN_TO_DLC -from opendbc.safety.tests.libsafety.safety_helpers import PandaSafety, setup_safety_helpers - -libsafety_dir = os.path.dirname(os.path.abspath(__file__)) -libsafety_fn = os.path.join(libsafety_dir, "libsafety.so") - -ffi = FFI() - -ffi.cdef(""" -typedef struct { - unsigned char fd : 1; - unsigned char bus : 3; - unsigned char data_len_code : 4; - unsigned char rejected : 1; - unsigned char returned : 1; - unsigned char extended : 1; - unsigned int addr : 29; - unsigned char checksum; - unsigned char data[64]; -} CANPacket_t; -""", packed=True) - -ffi.cdef(""" -bool safety_rx_hook(CANPacket_t *to_send); -bool safety_tx_hook(CANPacket_t *to_push); -int safety_fwd_hook(int bus_num, int addr); -int set_safety_hooks(uint16_t mode, uint16_t param); -""") - -ffi.cdef(""" -void can_set_checksum(CANPacket_t *packet); -""") - -setup_safety_helpers(ffi) - -class CANPacket: - reserved: int - bus: int - data_len_code: int - rejected: int - returned: int - extended: int - addr: int - data: list[int] - -class Panda(PandaSafety, Protocol): - # CAN - def can_set_checksum(self, p: CANPacket) -> None: ... - - # safety - def safety_rx_hook(self, to_send: CANPacket) -> int: ... - def safety_tx_hook(self, to_push: CANPacket) -> int: ... - def safety_fwd_hook(self, bus_num: int, addr: int) -> int: ... - def set_safety_hooks(self, mode: int, param: int) -> int: ... - - -libsafety: Panda = ffi.dlopen(libsafety_fn) - - -# helpers - -def make_CANPacket(addr: int, bus: int, dat): - ret = ffi.new('CANPacket_t *') - ret[0].extended = 1 if addr >= 0x800 else 0 - ret[0].addr = addr - ret[0].data_len_code = LEN_TO_DLC[len(dat)] - ret[0].bus = bus - ret[0].data = bytes(dat) - libsafety.can_set_checksum(ret) - - return ret diff --git a/opendbc/safety/tests/libsafety/safety.c b/opendbc/safety/tests/libsafety/safety.c deleted file mode 100644 index bdb63596b11..00000000000 --- a/opendbc/safety/tests/libsafety/safety.c +++ /dev/null @@ -1,13 +0,0 @@ -#include - -#include "fake_stm.h" -#include "can.h" - -//int safety_tx_hook(CANPacket_t *to_send) { return 1; } - -#include "faults.h" -#include "safety.h" -#include "drivers/can_common.h" - -// libsafety stuff -#include "safety_helpers.h" diff --git a/opendbc/safety/tests/libsafety/safety_helpers.h b/opendbc/safety/tests/libsafety/safety_helpers.h deleted file mode 100644 index 84e7eb736b5..00000000000 --- a/opendbc/safety/tests/libsafety/safety_helpers.h +++ /dev/null @@ -1,183 +0,0 @@ -void safety_tick_current_safety_config() { - safety_tick(¤t_safety_config); -} - -bool safety_config_valid() { - if (current_safety_config.rx_checks_len <= 0) { - printf("missing RX checks\n"); - return false; - } - - for (int i = 0; i < current_safety_config.rx_checks_len; i++) { - const RxCheck addr = current_safety_config.rx_checks[i]; - bool valid = addr.status.msg_seen && !addr.status.lagging && addr.status.valid_checksum && (addr.status.wrong_counters < MAX_WRONG_COUNTERS) && addr.status.valid_quality_flag; - if (!valid) { - // printf("i %d seen %d lagging %d valid checksum %d wrong counters %d valid quality flag %d\n", i, addr.status.msg_seen, addr.status.lagging, addr.status.valid_checksum, addr.status.wrong_counters, addr.status.valid_quality_flag); - return false; - } - } - return true; -} - -void set_controls_allowed(bool c){ - controls_allowed = c; -} - -void set_alternative_experience(int mode){ - alternative_experience = mode; -} - -void set_relay_malfunction(bool c){ - relay_malfunction = c; -} - -bool get_controls_allowed(void){ - return controls_allowed; -} - -int get_alternative_experience(void){ - return alternative_experience; -} - -bool get_relay_malfunction(void){ - return relay_malfunction; -} - -bool get_gas_pressed_prev(void){ - return gas_pressed_prev; -} - -void set_gas_pressed_prev(bool c){ - gas_pressed_prev = c; -} - -bool get_brake_pressed_prev(void){ - return brake_pressed_prev; -} - -bool get_regen_braking_prev(void){ - return regen_braking_prev; -} - -bool get_cruise_engaged_prev(void){ - return cruise_engaged_prev; -} - -void set_cruise_engaged_prev(bool engaged){ - cruise_engaged_prev = engaged; -} - -bool get_vehicle_moving(void){ - return vehicle_moving; -} - -bool get_acc_main_on(void){ - return acc_main_on; -} - -float get_vehicle_speed_min(void){ - return vehicle_speed.min / VEHICLE_SPEED_FACTOR; -} - -float get_vehicle_speed_max(void){ - return vehicle_speed.max / VEHICLE_SPEED_FACTOR; -} - -int get_current_safety_mode(void){ - return current_safety_mode; -} - -int get_current_safety_param(void){ - return current_safety_param; -} - -void set_timer(uint32_t t){ - timer.CNT = t; -} - -void set_torque_meas(int min, int max){ - torque_meas.min = min; - torque_meas.max = max; -} - -int get_torque_meas_min(void){ - return torque_meas.min; -} - -int get_torque_meas_max(void){ - return torque_meas.max; -} - -void set_torque_driver(int min, int max){ - torque_driver.min = min; - torque_driver.max = max; -} - -int get_torque_driver_min(void){ - return torque_driver.min; -} - -int get_torque_driver_max(void){ - return torque_driver.max; -} - -void set_rt_torque_last(int t){ - rt_torque_last = t; -} - -void set_desired_torque_last(int t){ - desired_torque_last = t; -} - -void set_desired_angle_last(int t){ - desired_angle_last = t; -} - -int get_desired_angle_last(void){ - return desired_angle_last; -} - -void set_angle_meas(int min, int max){ - angle_meas.min = min; - angle_meas.max = max; -} - -int get_angle_meas_min(void){ - return angle_meas.min; -} - -int get_angle_meas_max(void){ - return angle_meas.max; -} - - -// ***** car specific helpers ***** - -void set_honda_alt_brake_msg(bool c){ - honda_alt_brake_msg = c; -} - -void set_honda_bosch_long(bool c){ - honda_bosch_long = c; -} - -int get_honda_hw(void) { - return honda_hw; -} - -void set_honda_fwd_brake(bool c){ - honda_fwd_brake = c; -} - -bool get_honda_fwd_brake(void){ - return honda_fwd_brake; -} - -void init_tests(void){ - safety_mode_cnt = 2U; // avoid ignoring relay_malfunction logic - alternative_experience = 0; - set_timer(0); - ts_steer_req_mismatch_last = 0; - valid_steer_req_count = 0; - invalid_steer_req_count = 0; -} diff --git a/opendbc/safety/tests/libsafety/safety_helpers.py b/opendbc/safety/tests/libsafety/safety_helpers.py deleted file mode 100644 index cd116fb59a1..00000000000 --- a/opendbc/safety/tests/libsafety/safety_helpers.py +++ /dev/null @@ -1,102 +0,0 @@ -# panda safety helpers, from safety_helpers.c -from typing import Protocol - -def setup_safety_helpers(ffi): - ffi.cdef(""" - void set_controls_allowed(bool c); - bool get_controls_allowed(void); - bool get_longitudinal_allowed(void); - void set_alternative_experience(int mode); - int get_alternative_experience(void); - void set_relay_malfunction(bool c); - bool get_relay_malfunction(void); - bool get_gas_pressed_prev(void); - void set_gas_pressed_prev(bool); - bool get_brake_pressed_prev(void); - bool get_regen_braking_prev(void); - bool get_acc_main_on(void); - float get_vehicle_speed_min(void); - float get_vehicle_speed_max(void); - int get_current_safety_mode(void); - int get_current_safety_param(void); - - void set_torque_meas(int min, int max); - int get_torque_meas_min(void); - int get_torque_meas_max(void); - void set_torque_driver(int min, int max); - int get_torque_driver_min(void); - int get_torque_driver_max(void); - void set_desired_torque_last(int t); - void set_rt_torque_last(int t); - void set_desired_angle_last(int t); - int get_desired_angle_last(); - void set_angle_meas(int min, int max); - int get_angle_meas_min(void); - int get_angle_meas_max(void); - - bool get_cruise_engaged_prev(void); - void set_cruise_engaged_prev(bool engaged); - bool get_vehicle_moving(void); - void set_timer(uint32_t t); - - void safety_tick_current_safety_config(); - bool safety_config_valid(); - - void init_tests(void); - - void set_honda_fwd_brake(bool c); - bool get_honda_fwd_brake(void); - void set_honda_alt_brake_msg(bool c); - void set_honda_bosch_long(bool c); - int get_honda_hw(void); - """) - -class PandaSafety(Protocol): - def set_controls_allowed(self, c: bool) -> None: ... - def get_controls_allowed(self) -> bool: ... - def get_longitudinal_allowed(self) -> bool: ... - def set_alternative_experience(self, mode: int) -> None: ... - def get_alternative_experience(self) -> int: ... - def set_relay_malfunction(self, c: bool) -> None: ... - def get_relay_malfunction(self) -> bool: ... - def get_gas_pressed_prev(self) -> bool: ... - def set_gas_pressed_prev(self, c: bool) -> None: ... - def get_brake_pressed_prev(self) -> bool: ... - def get_regen_braking_prev(self) -> bool: ... - def get_acc_main_on(self) -> bool: ... - def get_vehicle_speed_min(self) -> int: ... - def get_vehicle_speed_max(self) -> int: ... - def get_current_safety_mode(self) -> int: ... - def get_current_safety_param(self) -> int: ... - - def set_torque_meas(self, min: int, max: int) -> None: ... # noqa: A002 - def get_torque_meas_min(self) -> int: ... - def get_torque_meas_max(self) -> int: ... - def set_torque_driver(self, min: int, max: int) -> None: ... # noqa: A002 - def get_torque_driver_min(self) -> int: ... - def get_torque_driver_max(self) -> int: ... - def set_desired_torque_last(self, t: int) -> None: ... - def set_rt_torque_last(self, t: int) -> None: ... - def set_desired_angle_last(self, t: int) -> None: ... - def get_desired_angle_last(self) -> int: ... - def set_angle_meas(self, min: int, max: int) -> None: ... # noqa: A002 - def get_angle_meas_min(self) -> int: ... - def get_angle_meas_max(self) -> int: ... - - def get_cruise_engaged_prev(self) -> bool: ... - def set_cruise_engaged_prev(self, enabled: bool) -> None: ... - def get_vehicle_moving(self) -> bool: ... - def set_timer(self, t: int) -> None: ... - - def safety_tick_current_safety_config(self) -> None: ... - def safety_config_valid(self) -> bool: ... - - def init_tests(self) -> None: ... - - def set_honda_fwd_brake(self, c: bool) -> None: ... - def get_honda_fwd_brake(self) -> bool: ... - def set_honda_alt_brake_msg(self, c: bool) -> None: ... - def set_honda_bosch_long(self, c: bool) -> None: ... - def get_honda_hw(self) -> int: ... - - diff --git a/opendbc/safety/tests/misra/.gitignore b/opendbc/safety/tests/misra/.gitignore deleted file mode 100644 index fc9ac228cb0..00000000000 --- a/opendbc/safety/tests/misra/.gitignore +++ /dev/null @@ -1,5 +0,0 @@ -*.pdf -*.txt -.output.log -new_table -cppcheck/ diff --git a/opendbc/safety/tests/misra/checkers.txt b/opendbc/safety/tests/misra/checkers.txt deleted file mode 100644 index 4e6f517e8ce..00000000000 --- a/opendbc/safety/tests/misra/checkers.txt +++ /dev/null @@ -1,911 +0,0 @@ -Cppcheck checkers list from test_misra.sh: - - - - - -TEST variant options: ---enable=all --disable=unusedFunction -DPANDA --addon=misra -DSTM32F4 -DSTM32F413xx /opendbc/safety/main.c - - -Critical errors ---------------- -No critical errors encountered. -Note: There might still have been non-critical bailouts which might lead to false negatives. - - -Open source checkers --------------------- -Yes Check64BitPortability::pointerassignment -Yes CheckAssert::assertWithSideEffects -Yes CheckAutoVariables::assignFunctionArg -Yes CheckAutoVariables::autoVariables -Yes CheckAutoVariables::checkVarLifetime -No CheckBool::checkAssignBoolToFloat require:style,c++ -Yes CheckBool::checkAssignBoolToPointer -No CheckBool::checkBitwiseOnBoolean require:style,inconclusive -Yes CheckBool::checkComparisonOfBoolExpressionWithInt -No CheckBool::checkComparisonOfBoolWithBool require:style,c++ -No CheckBool::checkComparisonOfBoolWithInt require:warning,c++ -No CheckBool::checkComparisonOfFuncReturningBool require:style,c++ -Yes CheckBool::checkIncrementBoolean -Yes CheckBool::pointerArithBool -Yes CheckBool::returnValueOfFunctionReturningBool -No CheckBoost::checkBoostForeachModification -Yes CheckBufferOverrun::analyseWholeProgram -Yes CheckBufferOverrun::argumentSize -Yes CheckBufferOverrun::arrayIndex -Yes CheckBufferOverrun::arrayIndexThenCheck -Yes CheckBufferOverrun::bufferOverflow -Yes CheckBufferOverrun::negativeArraySize -Yes CheckBufferOverrun::objectIndex -Yes CheckBufferOverrun::pointerArithmetic -No CheckBufferOverrun::stringNotZeroTerminated require:warning,inconclusive -Yes CheckClass::analyseWholeProgram -No CheckClass::checkConst require:style,inconclusive -No CheckClass::checkConstructors require:style,warning -No CheckClass::checkCopyConstructors require:warning -No CheckClass::checkDuplInheritedMembers require:warning -No CheckClass::checkExplicitConstructors require:style -No CheckClass::checkMemset -No CheckClass::checkMissingOverride require:style,c++03 -No CheckClass::checkReturnByReference require:performance -No CheckClass::checkSelfInitialization -No CheckClass::checkThisUseAfterFree require:warning -No CheckClass::checkUnsafeClassRefMember require:warning,safeChecks -No CheckClass::checkUselessOverride require:style -No CheckClass::checkVirtualFunctionCallInConstructor require:warning -No CheckClass::initializationListUsage require:performance -No CheckClass::initializerListOrder require:style,inconclusive -No CheckClass::operatorEqRetRefThis require:style -No CheckClass::operatorEqToSelf require:warning -No CheckClass::privateFunctions require:style -No CheckClass::thisSubtraction require:warning -No CheckClass::virtualDestructor -Yes CheckCondition::alwaysTrueFalse -Yes CheckCondition::assignIf -Yes CheckCondition::checkAssignmentInCondition -Yes CheckCondition::checkBadBitmaskCheck -Yes CheckCondition::checkCompareValueOutOfTypeRange -Yes CheckCondition::checkDuplicateConditionalAssign -Yes CheckCondition::checkIncorrectLogicOperator -Yes CheckCondition::checkInvalidTestForOverflow -Yes CheckCondition::checkModuloAlwaysTrueFalse -Yes CheckCondition::checkPointerAdditionResultNotNull -Yes CheckCondition::clarifyCondition -Yes CheckCondition::comparison -Yes CheckCondition::duplicateCondition -Yes CheckCondition::multiCondition -Yes CheckCondition::multiCondition2 -No CheckExceptionSafety::checkCatchExceptionByValue require:style -No CheckExceptionSafety::checkRethrowCopy require:style -No CheckExceptionSafety::deallocThrow require:warning -No CheckExceptionSafety::destructors require:warning -No CheckExceptionSafety::nothrowThrows -No CheckExceptionSafety::rethrowNoCurrentException -No CheckExceptionSafety::unhandledExceptionSpecification require:style,inconclusive -Yes CheckFunctions::checkIgnoredReturnValue -Yes CheckFunctions::checkMathFunctions -Yes CheckFunctions::checkMissingReturn -Yes CheckFunctions::checkProhibitedFunctions -Yes CheckFunctions::invalidFunctionUsage -Yes CheckFunctions::memsetInvalid2ndParam -Yes CheckFunctions::memsetZeroBytes -No CheckFunctions::returnLocalStdMove require:performance,c++11 -Yes CheckFunctions::useStandardLibrary -No CheckIO::checkCoutCerrMisusage require:c -Yes CheckIO::checkFileUsage -Yes CheckIO::checkWrongPrintfScanfArguments -Yes CheckIO::invalidScanf -Yes CheckLeakAutoVar::check -No CheckMemoryLeakInClass::check -Yes CheckMemoryLeakInFunction::checkReallocUsage -Yes CheckMemoryLeakNoVar::check -No CheckMemoryLeakNoVar::checkForUnsafeArgAlloc -Yes CheckMemoryLeakStructMember::check -Yes CheckNullPointer::analyseWholeProgram -Yes CheckNullPointer::arithmetic -Yes CheckNullPointer::nullConstantDereference -Yes CheckNullPointer::nullPointer -No CheckOther::checkAccessOfMovedVariable require:c++11,warning -Yes CheckOther::checkCastIntToCharAndBack -Yes CheckOther::checkCharVariable -Yes CheckOther::checkComparePointers -Yes CheckOther::checkComparisonFunctionIsAlwaysTrueOrFalse -Yes CheckOther::checkConstPointer -No CheckOther::checkConstVariable require:style,c++ -No CheckOther::checkDuplicateBranch require:style,inconclusive -Yes CheckOther::checkDuplicateExpression -Yes CheckOther::checkEvaluationOrder -Yes CheckOther::checkFuncArgNamesDifferent -No CheckOther::checkIncompleteArrayFill require:warning,portability,inconclusive -Yes CheckOther::checkIncompleteStatement -No CheckOther::checkInterlockedDecrement require:windows-platform -Yes CheckOther::checkInvalidFree -Yes CheckOther::checkKnownArgument -Yes CheckOther::checkKnownPointerToBool -No CheckOther::checkMisusedScopedObject require:style,c++ -Yes CheckOther::checkModuloOfOne -Yes CheckOther::checkNanInArithmeticExpression -Yes CheckOther::checkNegativeBitwiseShift -Yes CheckOther::checkOverlappingWrite -No CheckOther::checkPassByReference require:performance,c++ -Yes CheckOther::checkRedundantAssignment -No CheckOther::checkRedundantCopy require:c++,performance,inconclusive -Yes CheckOther::checkRedundantPointerOp -Yes CheckOther::checkShadowVariables -Yes CheckOther::checkSignOfUnsignedVariable -No CheckOther::checkSuspiciousCaseInSwitch require:warning,inconclusive -No CheckOther::checkSuspiciousSemicolon require:warning,inconclusive -Yes CheckOther::checkUnreachableCode -Yes CheckOther::checkUnusedLabel -Yes CheckOther::checkVarFuncNullUB -Yes CheckOther::checkVariableScope -Yes CheckOther::checkZeroDivision -Yes CheckOther::clarifyCalculation -Yes CheckOther::clarifyStatement -Yes CheckOther::invalidPointerCast -Yes CheckOther::redundantBitwiseOperationInSwitch -Yes CheckOther::suspiciousFloatingPointCast -No CheckOther::warningOldStylePointerCast require:style,c++ -No CheckPostfixOperator::postfixOperator require:performance -Yes CheckSizeof::checkSizeofForArrayParameter -Yes CheckSizeof::checkSizeofForNumericParameter -Yes CheckSizeof::checkSizeofForPointerSize -Yes CheckSizeof::sizeofCalculation -Yes CheckSizeof::sizeofFunction -Yes CheckSizeof::sizeofVoid -Yes CheckSizeof::sizeofsizeof -No CheckSizeof::suspiciousSizeofCalculation require:warning,inconclusive -No CheckStl::checkDereferenceInvalidIterator require:warning -No CheckStl::checkDereferenceInvalidIterator2 -No CheckStl::checkFindInsert require:performance -No CheckStl::checkMutexes require:warning -No CheckStl::erase -No CheckStl::eraseIteratorOutOfBounds -No CheckStl::if_find require:warning,performance -No CheckStl::invalidContainer -No CheckStl::iterators -No CheckStl::knownEmptyContainer require:style -No CheckStl::misMatchingContainerIterator -No CheckStl::misMatchingContainers -No CheckStl::missingComparison require:warning -No CheckStl::negativeIndex -No CheckStl::outOfBounds -No CheckStl::outOfBoundsIndexExpression -No CheckStl::redundantCondition require:style -No CheckStl::size require:performance,c++03 -No CheckStl::stlBoundaries -No CheckStl::stlOutOfBounds -No CheckStl::string_c_str -No CheckStl::useStlAlgorithm require:style -No CheckStl::uselessCalls require:performance,warning -Yes CheckString::checkAlwaysTrueOrFalseStringCompare -Yes CheckString::checkIncorrectStringCompare -Yes CheckString::checkSuspiciousStringCompare -Yes CheckString::overlappingStrcmp -Yes CheckString::sprintfOverlappingData -Yes CheckString::strPlusChar -Yes CheckString::stringLiteralWrite -Yes CheckType::checkFloatToIntegerOverflow -Yes CheckType::checkIntegerOverflow -Yes CheckType::checkLongCast -Yes CheckType::checkSignConversion -Yes CheckType::checkTooBigBitwiseShift -Yes CheckUninitVar::check -Yes CheckUninitVar::valueFlowUninit -No CheckUnusedFunctions::check require:unusedFunction -Yes CheckUnusedVar::checkFunctionVariableUsage -Yes CheckUnusedVar::checkStructMemberUsage -Yes CheckVaarg::va_list_usage -Yes CheckVaarg::va_start_argument - - -Premium checkers ----------------- -Not available, Cppcheck Premium is not used - - -Autosar -------- -Not available, Cppcheck Premium is not used - - -Cert C ------- -Not available, Cppcheck Premium is not used - - -Cert C++ --------- -Not available, Cppcheck Premium is not used - - -Misra C 2012 ------------- -No Misra C 2012: Dir 1.1 -No Misra C 2012: Dir 2.1 -No Misra C 2012: Dir 3.1 -No Misra C 2012: Dir 4.1 -No Misra C 2012: Dir 4.2 -No Misra C 2012: Dir 4.3 -No Misra C 2012: Dir 4.4 -No Misra C 2012: Dir 4.5 -No Misra C 2012: Dir 4.6 amendment:3 -No Misra C 2012: Dir 4.7 -No Misra C 2012: Dir 4.8 -No Misra C 2012: Dir 4.9 amendment:3 -No Misra C 2012: Dir 4.10 -No Misra C 2012: Dir 4.11 amendment:3 -No Misra C 2012: Dir 4.12 -No Misra C 2012: Dir 4.13 -No Misra C 2012: Dir 4.14 amendment:2 -No Misra C 2012: Dir 4.15 amendment:3 -No Misra C 2012: Dir 5.1 amendment:4 -No Misra C 2012: Dir 5.2 amendment:4 -No Misra C 2012: Dir 5.3 amendment:4 -Yes Misra C 2012: 1.1 -Yes Misra C 2012: 1.2 -Yes Misra C 2012: 1.3 -Yes Misra C 2012: 1.4 amendment:2 -No Misra C 2012: 1.5 amendment:3 require:premium -Yes Misra C 2012: 2.1 -Yes Misra C 2012: 2.2 -Yes Misra C 2012: 2.3 -Yes Misra C 2012: 2.4 -Yes Misra C 2012: 2.5 -Yes Misra C 2012: 2.6 -Yes Misra C 2012: 2.7 -Yes Misra C 2012: 2.8 -Yes Misra C 2012: 3.1 -Yes Misra C 2012: 3.2 -Yes Misra C 2012: 4.1 -Yes Misra C 2012: 4.2 -Yes Misra C 2012: 5.1 -Yes Misra C 2012: 5.2 -Yes Misra C 2012: 5.3 -Yes Misra C 2012: 5.4 -Yes Misra C 2012: 5.5 -Yes Misra C 2012: 5.6 -Yes Misra C 2012: 5.7 -Yes Misra C 2012: 5.8 -Yes Misra C 2012: 5.9 -Yes Misra C 2012: 6.1 -Yes Misra C 2012: 6.2 -No Misra C 2012: 6.3 -Yes Misra C 2012: 7.1 -Yes Misra C 2012: 7.2 -Yes Misra C 2012: 7.3 -Yes Misra C 2012: 7.4 -No Misra C 2012: 7.5 -No Misra C 2012: 7.6 -Yes Misra C 2012: 8.1 -Yes Misra C 2012: 8.2 -No Misra C 2012: 8.3 -Yes Misra C 2012: 8.4 -Yes Misra C 2012: 8.5 -Yes Misra C 2012: 8.6 -Yes Misra C 2012: 8.7 -Yes Misra C 2012: 8.8 -Yes Misra C 2012: 8.9 -Yes Misra C 2012: 8.10 -Yes Misra C 2012: 8.11 -Yes Misra C 2012: 8.12 -Yes Misra C 2012: 8.13 -Yes Misra C 2012: 8.14 -No Misra C 2012: 8.15 -No Misra C 2012: 8.16 -No Misra C 2012: 8.17 -Yes Misra C 2012: 9.1 -Yes Misra C 2012: 9.2 -Yes Misra C 2012: 9.3 -Yes Misra C 2012: 9.4 -Yes Misra C 2012: 9.5 -No Misra C 2012: 9.6 -No Misra C 2012: 9.7 -Yes Misra C 2012: 10.1 -Yes Misra C 2012: 10.2 -Yes Misra C 2012: 10.3 -Yes Misra C 2012: 10.4 -Yes Misra C 2012: 10.5 -Yes Misra C 2012: 10.6 -Yes Misra C 2012: 10.7 -Yes Misra C 2012: 10.8 -Yes Misra C 2012: 11.1 -Yes Misra C 2012: 11.2 -Yes Misra C 2012: 11.3 -Yes Misra C 2012: 11.4 -Yes Misra C 2012: 11.5 -Yes Misra C 2012: 11.6 -Yes Misra C 2012: 11.7 -Yes Misra C 2012: 11.8 -Yes Misra C 2012: 11.9 -No Misra C 2012: 11.10 -Yes Misra C 2012: 12.1 -Yes Misra C 2012: 12.2 -Yes Misra C 2012: 12.3 -Yes Misra C 2012: 12.4 -Yes Misra C 2012: 12.5 amendment:1 -No Misra C 2012: 12.6 amendment:4 require:premium -Yes Misra C 2012: 13.1 -No Misra C 2012: 13.2 -Yes Misra C 2012: 13.3 -Yes Misra C 2012: 13.4 -Yes Misra C 2012: 13.5 -Yes Misra C 2012: 13.6 -Yes Misra C 2012: 14.1 -Yes Misra C 2012: 14.2 -Yes Misra C 2012: 14.3 -Yes Misra C 2012: 14.4 -Yes Misra C 2012: 15.1 -Yes Misra C 2012: 15.2 -Yes Misra C 2012: 15.3 -Yes Misra C 2012: 15.4 -Yes Misra C 2012: 15.5 -Yes Misra C 2012: 15.6 -Yes Misra C 2012: 15.7 -Yes Misra C 2012: 16.1 -Yes Misra C 2012: 16.2 -Yes Misra C 2012: 16.3 -Yes Misra C 2012: 16.4 -Yes Misra C 2012: 16.5 -Yes Misra C 2012: 16.6 -Yes Misra C 2012: 16.7 -Yes Misra C 2012: 17.1 -Yes Misra C 2012: 17.2 -Yes Misra C 2012: 17.3 -No Misra C 2012: 17.4 -Yes Misra C 2012: 17.5 -Yes Misra C 2012: 17.6 -Yes Misra C 2012: 17.7 -Yes Misra C 2012: 17.8 -No Misra C 2012: 17.9 -No Misra C 2012: 17.10 -No Misra C 2012: 17.11 -No Misra C 2012: 17.12 -No Misra C 2012: 17.13 -Yes Misra C 2012: 18.1 -Yes Misra C 2012: 18.2 -Yes Misra C 2012: 18.3 -Yes Misra C 2012: 18.4 -Yes Misra C 2012: 18.5 -Yes Misra C 2012: 18.6 -Yes Misra C 2012: 18.7 -Yes Misra C 2012: 18.8 -No Misra C 2012: 18.9 -No Misra C 2012: 18.10 -Yes Misra C 2012: 19.1 -Yes Misra C 2012: 19.2 -Yes Misra C 2012: 20.1 -Yes Misra C 2012: 20.2 -Yes Misra C 2012: 20.3 -Yes Misra C 2012: 20.4 -Yes Misra C 2012: 20.5 -Yes Misra C 2012: 20.6 -Yes Misra C 2012: 20.7 -Yes Misra C 2012: 20.8 -Yes Misra C 2012: 20.9 -Yes Misra C 2012: 20.10 -Yes Misra C 2012: 20.11 -Yes Misra C 2012: 20.12 -Yes Misra C 2012: 20.13 -Yes Misra C 2012: 20.14 -Yes Misra C 2012: 21.1 -Yes Misra C 2012: 21.2 -Yes Misra C 2012: 21.3 -Yes Misra C 2012: 21.4 -Yes Misra C 2012: 21.5 -Yes Misra C 2012: 21.6 -Yes Misra C 2012: 21.7 -Yes Misra C 2012: 21.8 -Yes Misra C 2012: 21.9 -Yes Misra C 2012: 21.10 -Yes Misra C 2012: 21.11 -Yes Misra C 2012: 21.12 -Yes Misra C 2012: 21.13 amendment:1 -Yes Misra C 2012: 21.14 amendment:1 -Yes Misra C 2012: 21.15 amendment:1 -Yes Misra C 2012: 21.16 amendment:1 -Yes Misra C 2012: 21.17 amendment:1 -Yes Misra C 2012: 21.18 amendment:1 -Yes Misra C 2012: 21.19 amendment:1 -Yes Misra C 2012: 21.20 amendment:1 -Yes Misra C 2012: 21.21 amendment:3 -No Misra C 2012: 21.22 amendment:3 require:premium -No Misra C 2012: 21.23 amendment:3 require:premium -No Misra C 2012: 21.24 amendment:3 require:premium -No Misra C 2012: 21.25 amendment:4 require:premium -No Misra C 2012: 21.26 amendment:4 require:premium -Yes Misra C 2012: 22.1 -Yes Misra C 2012: 22.2 -Yes Misra C 2012: 22.3 -Yes Misra C 2012: 22.4 -Yes Misra C 2012: 22.5 -Yes Misra C 2012: 22.6 -Yes Misra C 2012: 22.7 amendment:1 -Yes Misra C 2012: 22.8 amendment:1 -Yes Misra C 2012: 22.9 amendment:1 -Yes Misra C 2012: 22.10 amendment:1 -No Misra C 2012: 22.11 amendment:4 require:premium -No Misra C 2012: 22.12 amendment:4 require:premium -No Misra C 2012: 22.13 amendment:4 require:premium -No Misra C 2012: 22.14 amendment:4 require:premium -No Misra C 2012: 22.15 amendment:4 require:premium -No Misra C 2012: 22.16 amendment:4 require:premium -No Misra C 2012: 22.17 amendment:4 require:premium -No Misra C 2012: 22.18 amendment:4 require:premium -No Misra C 2012: 22.19 amendment:4 require:premium -No Misra C 2012: 22.20 amendment:4 require:premium -No Misra C 2012: 23.1 amendment:3 require:premium -No Misra C 2012: 23.2 amendment:3 require:premium -No Misra C 2012: 23.3 amendment:3 require:premium -No Misra C 2012: 23.4 amendment:3 require:premium -No Misra C 2012: 23.5 amendment:3 require:premium -No Misra C 2012: 23.6 amendment:3 require:premium -No Misra C 2012: 23.7 amendment:3 require:premium -No Misra C 2012: 23.8 amendment:3 require:premium - - -Misra C++ 2008 --------------- -Not available, Cppcheck Premium is not used - - -Misra C++ 2023 --------------- -Not available, Cppcheck Premium is not used - - - - - -TEST variant options: ---enable=all --disable=unusedFunction -DPANDA --addon=misra -DSTM32H7 -DSTM32H725xx /opendbc/safety/main.c - - -Critical errors ---------------- -No critical errors encountered. -Note: There might still have been non-critical bailouts which might lead to false negatives. - - -Open source checkers --------------------- -Yes Check64BitPortability::pointerassignment -Yes CheckAssert::assertWithSideEffects -Yes CheckAutoVariables::assignFunctionArg -Yes CheckAutoVariables::autoVariables -Yes CheckAutoVariables::checkVarLifetime -No CheckBool::checkAssignBoolToFloat require:style,c++ -Yes CheckBool::checkAssignBoolToPointer -No CheckBool::checkBitwiseOnBoolean require:style,inconclusive -Yes CheckBool::checkComparisonOfBoolExpressionWithInt -No CheckBool::checkComparisonOfBoolWithBool require:style,c++ -No CheckBool::checkComparisonOfBoolWithInt require:warning,c++ -No CheckBool::checkComparisonOfFuncReturningBool require:style,c++ -Yes CheckBool::checkIncrementBoolean -Yes CheckBool::pointerArithBool -Yes CheckBool::returnValueOfFunctionReturningBool -No CheckBoost::checkBoostForeachModification -Yes CheckBufferOverrun::analyseWholeProgram -Yes CheckBufferOverrun::argumentSize -Yes CheckBufferOverrun::arrayIndex -Yes CheckBufferOverrun::arrayIndexThenCheck -Yes CheckBufferOverrun::bufferOverflow -Yes CheckBufferOverrun::negativeArraySize -Yes CheckBufferOverrun::objectIndex -Yes CheckBufferOverrun::pointerArithmetic -No CheckBufferOverrun::stringNotZeroTerminated require:warning,inconclusive -Yes CheckClass::analyseWholeProgram -No CheckClass::checkConst require:style,inconclusive -No CheckClass::checkConstructors require:style,warning -No CheckClass::checkCopyConstructors require:warning -No CheckClass::checkDuplInheritedMembers require:warning -No CheckClass::checkExplicitConstructors require:style -No CheckClass::checkMemset -No CheckClass::checkMissingOverride require:style,c++03 -No CheckClass::checkReturnByReference require:performance -No CheckClass::checkSelfInitialization -No CheckClass::checkThisUseAfterFree require:warning -No CheckClass::checkUnsafeClassRefMember require:warning,safeChecks -No CheckClass::checkUselessOverride require:style -No CheckClass::checkVirtualFunctionCallInConstructor require:warning -No CheckClass::initializationListUsage require:performance -No CheckClass::initializerListOrder require:style,inconclusive -No CheckClass::operatorEqRetRefThis require:style -No CheckClass::operatorEqToSelf require:warning -No CheckClass::privateFunctions require:style -No CheckClass::thisSubtraction require:warning -No CheckClass::virtualDestructor -Yes CheckCondition::alwaysTrueFalse -Yes CheckCondition::assignIf -Yes CheckCondition::checkAssignmentInCondition -Yes CheckCondition::checkBadBitmaskCheck -Yes CheckCondition::checkCompareValueOutOfTypeRange -Yes CheckCondition::checkDuplicateConditionalAssign -Yes CheckCondition::checkIncorrectLogicOperator -Yes CheckCondition::checkInvalidTestForOverflow -Yes CheckCondition::checkModuloAlwaysTrueFalse -Yes CheckCondition::checkPointerAdditionResultNotNull -Yes CheckCondition::clarifyCondition -Yes CheckCondition::comparison -Yes CheckCondition::duplicateCondition -Yes CheckCondition::multiCondition -Yes CheckCondition::multiCondition2 -No CheckExceptionSafety::checkCatchExceptionByValue require:style -No CheckExceptionSafety::checkRethrowCopy require:style -No CheckExceptionSafety::deallocThrow require:warning -No CheckExceptionSafety::destructors require:warning -No CheckExceptionSafety::nothrowThrows -No CheckExceptionSafety::rethrowNoCurrentException -No CheckExceptionSafety::unhandledExceptionSpecification require:style,inconclusive -Yes CheckFunctions::checkIgnoredReturnValue -Yes CheckFunctions::checkMathFunctions -Yes CheckFunctions::checkMissingReturn -Yes CheckFunctions::checkProhibitedFunctions -Yes CheckFunctions::invalidFunctionUsage -Yes CheckFunctions::memsetInvalid2ndParam -Yes CheckFunctions::memsetZeroBytes -No CheckFunctions::returnLocalStdMove require:performance,c++11 -Yes CheckFunctions::useStandardLibrary -No CheckIO::checkCoutCerrMisusage require:c -Yes CheckIO::checkFileUsage -Yes CheckIO::checkWrongPrintfScanfArguments -Yes CheckIO::invalidScanf -Yes CheckLeakAutoVar::check -No CheckMemoryLeakInClass::check -Yes CheckMemoryLeakInFunction::checkReallocUsage -Yes CheckMemoryLeakNoVar::check -No CheckMemoryLeakNoVar::checkForUnsafeArgAlloc -Yes CheckMemoryLeakStructMember::check -Yes CheckNullPointer::analyseWholeProgram -Yes CheckNullPointer::arithmetic -Yes CheckNullPointer::nullConstantDereference -Yes CheckNullPointer::nullPointer -No CheckOther::checkAccessOfMovedVariable require:c++11,warning -Yes CheckOther::checkCastIntToCharAndBack -Yes CheckOther::checkCharVariable -Yes CheckOther::checkComparePointers -Yes CheckOther::checkComparisonFunctionIsAlwaysTrueOrFalse -Yes CheckOther::checkConstPointer -No CheckOther::checkConstVariable require:style,c++ -No CheckOther::checkDuplicateBranch require:style,inconclusive -Yes CheckOther::checkDuplicateExpression -Yes CheckOther::checkEvaluationOrder -Yes CheckOther::checkFuncArgNamesDifferent -No CheckOther::checkIncompleteArrayFill require:warning,portability,inconclusive -Yes CheckOther::checkIncompleteStatement -No CheckOther::checkInterlockedDecrement require:windows-platform -Yes CheckOther::checkInvalidFree -Yes CheckOther::checkKnownArgument -Yes CheckOther::checkKnownPointerToBool -No CheckOther::checkMisusedScopedObject require:style,c++ -Yes CheckOther::checkModuloOfOne -Yes CheckOther::checkNanInArithmeticExpression -Yes CheckOther::checkNegativeBitwiseShift -Yes CheckOther::checkOverlappingWrite -No CheckOther::checkPassByReference require:performance,c++ -Yes CheckOther::checkRedundantAssignment -No CheckOther::checkRedundantCopy require:c++,performance,inconclusive -Yes CheckOther::checkRedundantPointerOp -Yes CheckOther::checkShadowVariables -Yes CheckOther::checkSignOfUnsignedVariable -No CheckOther::checkSuspiciousCaseInSwitch require:warning,inconclusive -No CheckOther::checkSuspiciousSemicolon require:warning,inconclusive -Yes CheckOther::checkUnreachableCode -Yes CheckOther::checkUnusedLabel -Yes CheckOther::checkVarFuncNullUB -Yes CheckOther::checkVariableScope -Yes CheckOther::checkZeroDivision -Yes CheckOther::clarifyCalculation -Yes CheckOther::clarifyStatement -Yes CheckOther::invalidPointerCast -Yes CheckOther::redundantBitwiseOperationInSwitch -Yes CheckOther::suspiciousFloatingPointCast -No CheckOther::warningOldStylePointerCast require:style,c++ -No CheckPostfixOperator::postfixOperator require:performance -Yes CheckSizeof::checkSizeofForArrayParameter -Yes CheckSizeof::checkSizeofForNumericParameter -Yes CheckSizeof::checkSizeofForPointerSize -Yes CheckSizeof::sizeofCalculation -Yes CheckSizeof::sizeofFunction -Yes CheckSizeof::sizeofVoid -Yes CheckSizeof::sizeofsizeof -No CheckSizeof::suspiciousSizeofCalculation require:warning,inconclusive -No CheckStl::checkDereferenceInvalidIterator require:warning -No CheckStl::checkDereferenceInvalidIterator2 -No CheckStl::checkFindInsert require:performance -No CheckStl::checkMutexes require:warning -No CheckStl::erase -No CheckStl::eraseIteratorOutOfBounds -No CheckStl::if_find require:warning,performance -No CheckStl::invalidContainer -No CheckStl::iterators -No CheckStl::knownEmptyContainer require:style -No CheckStl::misMatchingContainerIterator -No CheckStl::misMatchingContainers -No CheckStl::missingComparison require:warning -No CheckStl::negativeIndex -No CheckStl::outOfBounds -No CheckStl::outOfBoundsIndexExpression -No CheckStl::redundantCondition require:style -No CheckStl::size require:performance,c++03 -No CheckStl::stlBoundaries -No CheckStl::stlOutOfBounds -No CheckStl::string_c_str -No CheckStl::useStlAlgorithm require:style -No CheckStl::uselessCalls require:performance,warning -Yes CheckString::checkAlwaysTrueOrFalseStringCompare -Yes CheckString::checkIncorrectStringCompare -Yes CheckString::checkSuspiciousStringCompare -Yes CheckString::overlappingStrcmp -Yes CheckString::sprintfOverlappingData -Yes CheckString::strPlusChar -Yes CheckString::stringLiteralWrite -Yes CheckType::checkFloatToIntegerOverflow -Yes CheckType::checkIntegerOverflow -Yes CheckType::checkLongCast -Yes CheckType::checkSignConversion -Yes CheckType::checkTooBigBitwiseShift -Yes CheckUninitVar::check -Yes CheckUninitVar::valueFlowUninit -No CheckUnusedFunctions::check require:unusedFunction -Yes CheckUnusedVar::checkFunctionVariableUsage -Yes CheckUnusedVar::checkStructMemberUsage -Yes CheckVaarg::va_list_usage -Yes CheckVaarg::va_start_argument - - -Premium checkers ----------------- -Not available, Cppcheck Premium is not used - - -Autosar -------- -Not available, Cppcheck Premium is not used - - -Cert C ------- -Not available, Cppcheck Premium is not used - - -Cert C++ --------- -Not available, Cppcheck Premium is not used - - -Misra C 2012 ------------- -No Misra C 2012: Dir 1.1 -No Misra C 2012: Dir 2.1 -No Misra C 2012: Dir 3.1 -No Misra C 2012: Dir 4.1 -No Misra C 2012: Dir 4.2 -No Misra C 2012: Dir 4.3 -No Misra C 2012: Dir 4.4 -No Misra C 2012: Dir 4.5 -No Misra C 2012: Dir 4.6 amendment:3 -No Misra C 2012: Dir 4.7 -No Misra C 2012: Dir 4.8 -No Misra C 2012: Dir 4.9 amendment:3 -No Misra C 2012: Dir 4.10 -No Misra C 2012: Dir 4.11 amendment:3 -No Misra C 2012: Dir 4.12 -No Misra C 2012: Dir 4.13 -No Misra C 2012: Dir 4.14 amendment:2 -No Misra C 2012: Dir 4.15 amendment:3 -No Misra C 2012: Dir 5.1 amendment:4 -No Misra C 2012: Dir 5.2 amendment:4 -No Misra C 2012: Dir 5.3 amendment:4 -Yes Misra C 2012: 1.1 -Yes Misra C 2012: 1.2 -Yes Misra C 2012: 1.3 -Yes Misra C 2012: 1.4 amendment:2 -No Misra C 2012: 1.5 amendment:3 require:premium -Yes Misra C 2012: 2.1 -Yes Misra C 2012: 2.2 -Yes Misra C 2012: 2.3 -Yes Misra C 2012: 2.4 -Yes Misra C 2012: 2.5 -Yes Misra C 2012: 2.6 -Yes Misra C 2012: 2.7 -Yes Misra C 2012: 2.8 -Yes Misra C 2012: 3.1 -Yes Misra C 2012: 3.2 -Yes Misra C 2012: 4.1 -Yes Misra C 2012: 4.2 -Yes Misra C 2012: 5.1 -Yes Misra C 2012: 5.2 -Yes Misra C 2012: 5.3 -Yes Misra C 2012: 5.4 -Yes Misra C 2012: 5.5 -Yes Misra C 2012: 5.6 -Yes Misra C 2012: 5.7 -Yes Misra C 2012: 5.8 -Yes Misra C 2012: 5.9 -Yes Misra C 2012: 6.1 -Yes Misra C 2012: 6.2 -No Misra C 2012: 6.3 -Yes Misra C 2012: 7.1 -Yes Misra C 2012: 7.2 -Yes Misra C 2012: 7.3 -Yes Misra C 2012: 7.4 -No Misra C 2012: 7.5 -No Misra C 2012: 7.6 -Yes Misra C 2012: 8.1 -Yes Misra C 2012: 8.2 -No Misra C 2012: 8.3 -Yes Misra C 2012: 8.4 -Yes Misra C 2012: 8.5 -Yes Misra C 2012: 8.6 -Yes Misra C 2012: 8.7 -Yes Misra C 2012: 8.8 -Yes Misra C 2012: 8.9 -Yes Misra C 2012: 8.10 -Yes Misra C 2012: 8.11 -Yes Misra C 2012: 8.12 -Yes Misra C 2012: 8.13 -Yes Misra C 2012: 8.14 -No Misra C 2012: 8.15 -No Misra C 2012: 8.16 -No Misra C 2012: 8.17 -Yes Misra C 2012: 9.1 -Yes Misra C 2012: 9.2 -Yes Misra C 2012: 9.3 -Yes Misra C 2012: 9.4 -Yes Misra C 2012: 9.5 -No Misra C 2012: 9.6 -No Misra C 2012: 9.7 -Yes Misra C 2012: 10.1 -Yes Misra C 2012: 10.2 -Yes Misra C 2012: 10.3 -Yes Misra C 2012: 10.4 -Yes Misra C 2012: 10.5 -Yes Misra C 2012: 10.6 -Yes Misra C 2012: 10.7 -Yes Misra C 2012: 10.8 -Yes Misra C 2012: 11.1 -Yes Misra C 2012: 11.2 -Yes Misra C 2012: 11.3 -Yes Misra C 2012: 11.4 -Yes Misra C 2012: 11.5 -Yes Misra C 2012: 11.6 -Yes Misra C 2012: 11.7 -Yes Misra C 2012: 11.8 -Yes Misra C 2012: 11.9 -No Misra C 2012: 11.10 -Yes Misra C 2012: 12.1 -Yes Misra C 2012: 12.2 -Yes Misra C 2012: 12.3 -Yes Misra C 2012: 12.4 -Yes Misra C 2012: 12.5 amendment:1 -No Misra C 2012: 12.6 amendment:4 require:premium -Yes Misra C 2012: 13.1 -No Misra C 2012: 13.2 -Yes Misra C 2012: 13.3 -Yes Misra C 2012: 13.4 -Yes Misra C 2012: 13.5 -Yes Misra C 2012: 13.6 -Yes Misra C 2012: 14.1 -Yes Misra C 2012: 14.2 -Yes Misra C 2012: 14.3 -Yes Misra C 2012: 14.4 -Yes Misra C 2012: 15.1 -Yes Misra C 2012: 15.2 -Yes Misra C 2012: 15.3 -Yes Misra C 2012: 15.4 -Yes Misra C 2012: 15.5 -Yes Misra C 2012: 15.6 -Yes Misra C 2012: 15.7 -Yes Misra C 2012: 16.1 -Yes Misra C 2012: 16.2 -Yes Misra C 2012: 16.3 -Yes Misra C 2012: 16.4 -Yes Misra C 2012: 16.5 -Yes Misra C 2012: 16.6 -Yes Misra C 2012: 16.7 -Yes Misra C 2012: 17.1 -Yes Misra C 2012: 17.2 -Yes Misra C 2012: 17.3 -No Misra C 2012: 17.4 -Yes Misra C 2012: 17.5 -Yes Misra C 2012: 17.6 -Yes Misra C 2012: 17.7 -Yes Misra C 2012: 17.8 -No Misra C 2012: 17.9 -No Misra C 2012: 17.10 -No Misra C 2012: 17.11 -No Misra C 2012: 17.12 -No Misra C 2012: 17.13 -Yes Misra C 2012: 18.1 -Yes Misra C 2012: 18.2 -Yes Misra C 2012: 18.3 -Yes Misra C 2012: 18.4 -Yes Misra C 2012: 18.5 -Yes Misra C 2012: 18.6 -Yes Misra C 2012: 18.7 -Yes Misra C 2012: 18.8 -No Misra C 2012: 18.9 -No Misra C 2012: 18.10 -Yes Misra C 2012: 19.1 -Yes Misra C 2012: 19.2 -Yes Misra C 2012: 20.1 -Yes Misra C 2012: 20.2 -Yes Misra C 2012: 20.3 -Yes Misra C 2012: 20.4 -Yes Misra C 2012: 20.5 -Yes Misra C 2012: 20.6 -Yes Misra C 2012: 20.7 -Yes Misra C 2012: 20.8 -Yes Misra C 2012: 20.9 -Yes Misra C 2012: 20.10 -Yes Misra C 2012: 20.11 -Yes Misra C 2012: 20.12 -Yes Misra C 2012: 20.13 -Yes Misra C 2012: 20.14 -Yes Misra C 2012: 21.1 -Yes Misra C 2012: 21.2 -Yes Misra C 2012: 21.3 -Yes Misra C 2012: 21.4 -Yes Misra C 2012: 21.5 -Yes Misra C 2012: 21.6 -Yes Misra C 2012: 21.7 -Yes Misra C 2012: 21.8 -Yes Misra C 2012: 21.9 -Yes Misra C 2012: 21.10 -Yes Misra C 2012: 21.11 -Yes Misra C 2012: 21.12 -Yes Misra C 2012: 21.13 amendment:1 -Yes Misra C 2012: 21.14 amendment:1 -Yes Misra C 2012: 21.15 amendment:1 -Yes Misra C 2012: 21.16 amendment:1 -Yes Misra C 2012: 21.17 amendment:1 -Yes Misra C 2012: 21.18 amendment:1 -Yes Misra C 2012: 21.19 amendment:1 -Yes Misra C 2012: 21.20 amendment:1 -Yes Misra C 2012: 21.21 amendment:3 -No Misra C 2012: 21.22 amendment:3 require:premium -No Misra C 2012: 21.23 amendment:3 require:premium -No Misra C 2012: 21.24 amendment:3 require:premium -No Misra C 2012: 21.25 amendment:4 require:premium -No Misra C 2012: 21.26 amendment:4 require:premium -Yes Misra C 2012: 22.1 -Yes Misra C 2012: 22.2 -Yes Misra C 2012: 22.3 -Yes Misra C 2012: 22.4 -Yes Misra C 2012: 22.5 -Yes Misra C 2012: 22.6 -Yes Misra C 2012: 22.7 amendment:1 -Yes Misra C 2012: 22.8 amendment:1 -Yes Misra C 2012: 22.9 amendment:1 -Yes Misra C 2012: 22.10 amendment:1 -No Misra C 2012: 22.11 amendment:4 require:premium -No Misra C 2012: 22.12 amendment:4 require:premium -No Misra C 2012: 22.13 amendment:4 require:premium -No Misra C 2012: 22.14 amendment:4 require:premium -No Misra C 2012: 22.15 amendment:4 require:premium -No Misra C 2012: 22.16 amendment:4 require:premium -No Misra C 2012: 22.17 amendment:4 require:premium -No Misra C 2012: 22.18 amendment:4 require:premium -No Misra C 2012: 22.19 amendment:4 require:premium -No Misra C 2012: 22.20 amendment:4 require:premium -No Misra C 2012: 23.1 amendment:3 require:premium -No Misra C 2012: 23.2 amendment:3 require:premium -No Misra C 2012: 23.3 amendment:3 require:premium -No Misra C 2012: 23.4 amendment:3 require:premium -No Misra C 2012: 23.5 amendment:3 require:premium -No Misra C 2012: 23.6 amendment:3 require:premium -No Misra C 2012: 23.7 amendment:3 require:premium -No Misra C 2012: 23.8 amendment:3 require:premium - - -Misra C++ 2008 --------------- -Not available, Cppcheck Premium is not used - - -Misra C++ 2023 --------------- -Not available, Cppcheck Premium is not used diff --git a/opendbc/safety/tests/misra/coverage_table b/opendbc/safety/tests/misra/coverage_table deleted file mode 100644 index 0395aba0d67..00000000000 --- a/opendbc/safety/tests/misra/coverage_table +++ /dev/null @@ -1,156 +0,0 @@ -1.1 -1.2 X (Addon) -1.3 X (Cppcheck) -2.1 X (Cppcheck) -2.2 X (Addon) -2.3 X (Addon) -2.4 X (Addon) -2.5 X (Addon) -2.6 X (Cppcheck) -2.7 X (Addon) -3.1 X (Addon) -3.2 X (Addon) -4.1 X (Addon) -4.2 X (Addon) -5.1 X (Addon) -5.2 X (Addon) -5.3 X (Cppcheck) -5.4 X (Addon) -5.5 X (Addon) -5.6 X (Addon) -5.7 X (Addon) -5.8 X (Addon) -5.9 X (Addon) -6.1 X (Addon) -6.2 X (Addon) -7.1 X (Addon) -7.2 X (Addon) -7.3 X (Addon) -7.4 X (Addon) -8.1 X (Addon) -8.2 X (Addon) -8.3 X (Cppcheck) -8.4 X (Addon) -8.5 X (Addon) -8.6 X (Addon) -8.7 X (Addon) -8.8 X (Addon) -8.9 X (Addon) -8.10 X (Addon) -8.11 X (Addon) -8.12 X (Addon) -8.13 X (Cppcheck) -8.14 X (Addon) -9.1 X (Cppcheck) -9.2 X (Addon) -9.3 X (Addon) -9.4 X (Addon) -9.5 X (Addon) -10.1 X (Addon) -10.2 X (Addon) -10.3 X (Addon) -10.4 X (Addon) -10.5 X (Addon) -10.6 X (Addon) -10.7 X (Addon) -10.8 X (Addon) -11.1 X (Addon) -11.2 X (Addon) -11.3 X (Addon) -11.4 X (Addon) -11.5 X (Addon) -11.6 X (Addon) -11.7 X (Addon) -11.8 X (Addon) -11.9 X (Addon) -12.1 X (Addon) -12.2 X (Addon) -12.3 X (Addon) -12.4 X (Addon) -13.1 X (Addon) -13.2 X (Cppcheck) -13.3 X (Addon) -13.4 X (Addon) -13.5 X (Addon) -13.6 X (Addon) -14.1 X (Addon) -14.2 X (Addon) -14.3 X (Cppcheck) -14.4 X (Addon) -15.1 X (Addon) -15.2 X (Addon) -15.3 X (Addon) -15.4 X (Addon) -15.5 X (Addon) -15.6 X (Addon) -15.7 X (Addon) -16.1 X (Addon) -16.2 X (Addon) -16.3 X (Addon) -16.4 X (Addon) -16.5 X (Addon) -16.6 X (Addon) -16.7 X (Addon) -17.1 X (Addon) -17.2 X (Addon) -17.3 X (Addon) -17.4 X (Cppcheck) -17.5 X (Cppcheck) -17.6 X (Addon) -17.7 X (Addon) -17.8 X (Addon) -18.1 X (Cppcheck) -18.2 X (Cppcheck) -18.3 X (Cppcheck) -18.4 X (Addon) -18.5 X (Addon) -18.6 X (Cppcheck) -18.7 X (Addon) -18.8 X (Addon) -19.1 X (Cppcheck) -19.2 X (Addon) -20.1 X (Addon) -20.2 X (Addon) -20.3 X (Addon) -20.4 X (Addon) -20.5 X (Addon) -20.6 X (Cppcheck) -20.7 X (Addon) -20.8 X (Addon) -20.9 X (Addon) -20.10 X (Addon) -20.11 X (Addon) -20.12 X (Addon) -20.13 X (Addon) -20.14 X (Addon) -21.1 X (Addon) -21.2 X (Addon) -21.3 X (Addon) -21.4 X (Addon) -21.5 X (Addon) -21.6 X (Addon) -21.7 X (Addon) -21.8 X (Addon) -21.9 X (Addon) -21.10 X (Addon) -21.11 X (Addon) -21.12 X (Addon) -21.13 X (Cppcheck) -21.14 X (Addon) -21.15 X (Addon) -21.16 X (Addon) -21.17 X (Cppcheck) -21.18 X (Cppcheck) -21.19 X (Addon) -21.20 X (Addon) -21.21 X (Addon) -22.1 X (Cppcheck) -22.2 X (Cppcheck) -22.3 X (Cppcheck) -22.4 X (Cppcheck) -22.5 X (Addon) -22.6 X (Cppcheck) -22.7 X (Addon) -22.8 X (Addon) -22.9 X (Addon) -22.10 X (Addon) diff --git a/opendbc/safety/tests/misra/install.sh b/opendbc/safety/tests/misra/install.sh deleted file mode 100755 index 9c8fd385c81..00000000000 --- a/opendbc/safety/tests/misra/install.sh +++ /dev/null @@ -1,18 +0,0 @@ -#!/usr/bin/env bash -set -e - -DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" -: "${CPPCHECK_DIR:=$DIR/cppcheck/}" - -if [ ! -d "$CPPCHECK_DIR" ]; then - git clone https://github.com/danmar/cppcheck.git $CPPCHECK_DIR -fi - -cd $CPPCHECK_DIR - -VERS="2.16.0" -git fetch --all --tags --force -git checkout $VERS - -#make clean -make MATCHCOMPILTER=yes CXXFLAGS="-O2" -j8 diff --git a/opendbc/safety/tests/misra/suppressions.txt b/opendbc/safety/tests/misra/suppressions.txt deleted file mode 100644 index 4800a270bcb..00000000000 --- a/opendbc/safety/tests/misra/suppressions.txt +++ /dev/null @@ -1,21 +0,0 @@ -# Advisory: casting from void pointer to type pointer is ok. Done by STM libraries as well -misra-c2012-11.4 -# Advisory: casting from void pointer to type pointer is ok. Done by STM libraries as well -misra-c2012-11.5 -# Advisory: as stated in the Misra document, use of goto statements in accordance to 15.2 and 15.3 is ok -misra-c2012-15.1 -# Advisory: union types can be used -misra-c2012-19.2 -# Advisory: The # and ## preprocessor operators should not be used -misra-c2012-20.10 - -# needed since not all of these suppressions are applicable to all builds -unmatchedSuppression - -# All interrupt handlers are defined, including ones we don't use -unusedFunction:*/interrupt_handlers*.h - -# all of the below suppressions are from new checks introduced after updating -# cppcheck from 2.5 -> 2.13. they are listed here to separate the update from -# fixing the violations and all are intended to be removed soon after -misra-c2012-2.5 # unused macros. a few legit, rest aren't common between F4/H7 builds. should we do this in the unusedFunction pass? diff --git a/opendbc/safety/tests/misra/test_misra.sh b/opendbc/safety/tests/misra/test_misra.sh deleted file mode 100755 index 0ff97d712fc..00000000000 --- a/opendbc/safety/tests/misra/test_misra.sh +++ /dev/null @@ -1,86 +0,0 @@ -#!/usr/bin/env bash -set -e - -DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" -cd $DIR - -source ../../../../setup.sh - -GREEN="\e[1;32m" -YELLOW="\e[1;33m" -RED="\e[1;31m" -NC='\033[0m' - -: "${CPPCHECK_DIR:=$DIR/cppcheck/}" - -# install cppcheck if missing -if [ -z "${SKIP_CPPCHECK_INSTALL}" ]; then - $DIR/install.sh -fi - -# ensure checked in coverage table is up to date -if [ -z "$SKIP_TABLES_DIFF" ]; then - python3 $CPPCHECK_DIR/addons/misra.py -generate-table > coverage_table - if ! git diff --quiet coverage_table; then - echo -e "${YELLOW}MISRA coverage table doesn't match. Update and commit:${NC}" - exit 3 - fi -fi - -cd $BASEDIR -if [ -z "${SKIP_BUILD}" ]; then - scons -j8 -fi - -CHECKLIST=$DIR/checkers.txt -echo "Cppcheck checkers list from test_misra.sh:" > $CHECKLIST - -cppcheck() { - # get all gcc defines: arm-none-eabi-gcc -dM -E - < /dev/null - COMMON_DEFINES="-D__GNUC__=9 -UCMSIS_NVIC_VIRTUAL -UCMSIS_VECTAB_VIRTUAL" - - # note that cppcheck build cache results in inconsistent results as of v2.13.0 - OUTPUT=$DIR/.output.log - - echo -e "\n\n\n\n\nTEST variant options:" >> $CHECKLIST - echo -e ""${@//$BASEDIR/}"\n\n" >> $CHECKLIST # (absolute path removed) - - $CPPCHECK_DIR/cppcheck --inline-suppr -I $BASEDIR/opendbc/safety/ \ - -I $BASEDIR/opendbc/safety/safety/ -I $BASEDIR/opendbc/safety/board/ \ - -I "$(arm-none-eabi-gcc -print-file-name=include)" \ - --suppressions-list=$DIR/suppressions.txt --suppress=*:*inc/* \ - --suppress=*:*include/* --error-exitcode=2 --check-level=exhaustive --safety \ - --platform=arm32-wchar_t4 $COMMON_DEFINES --checkers-report=$CHECKLIST.tmp \ - --std=c11 "$@" 2>&1 | tee $OUTPUT - - cat $CHECKLIST.tmp >> $CHECKLIST - rm $CHECKLIST.tmp - # cppcheck bug: some MISRA errors won't result in the error exit code, - # so check the output (https://trac.cppcheck.net/ticket/12440#no1) - if grep -e "misra violation" -e "error" -e "style: " $OUTPUT > /dev/null; then - printf "${RED}** FAILED: MISRA violations found!${NC}\n" - exit 1 - fi -} - -PANDA_OPTS="--enable=all --disable=unusedFunction -DPANDA --addon=misra" - -printf "\n${GREEN}** PANDA F4 CODE **${NC}\n" -cppcheck $PANDA_OPTS -DSTM32F4 -DSTM32F413xx $BASEDIR/opendbc/safety/main.c - -printf "\n${GREEN}** PANDA H7 CODE **${NC}\n" -cppcheck $PANDA_OPTS -DSTM32H7 -DSTM32H725xx $BASEDIR/opendbc/safety/main.c - -# unused needs to run globally -#printf "\n${GREEN}** UNUSED ALL CODE **${NC}\n" -#cppcheck --enable=unusedFunction --quiet $BASEDIR/opendbc/safety/board/ - -printf "\n${GREEN}Success!${NC} took $SECONDS seconds\n" - - -# ensure list of checkers is up to date -cd $DIR -if [ -z "$SKIP_TABLES_DIFF" ] && ! git diff --quiet $CHECKLIST; then - echo -e "\n${YELLOW}WARNING: Cppcheck checkers.txt report has changed. Review and commit...${NC}" - exit 4 -fi diff --git a/opendbc/safety/tests/misra/test_mutation.py b/opendbc/safety/tests/misra/test_mutation.py deleted file mode 100755 index 1caf51a8641..00000000000 --- a/opendbc/safety/tests/misra/test_mutation.py +++ /dev/null @@ -1,69 +0,0 @@ -#!/usr/bin/env python3 -import os -import glob -import pytest -import shutil -import subprocess -import tempfile -import random - -HERE = os.path.abspath(os.path.dirname(__file__)) -ROOT = os.path.join(HERE, "../../../../") - -IGNORED_PATHS = ( - 'opendbc/safety/tests/', - 'opendbc/safety/board/', -) - -mutations = [ - # default - (None, None, False), - # general safety - ("opendbc/safety/safety/safety_toyota.h", "s/is_lkas_msg =.*;/is_lkas_msg = addr == 1 || addr == 2;/g", True), -] - -patterns = [ - # misra-c2012-13.3 - "$a void test(int tmp) { int tmp2 = tmp++ + 2; if (tmp2) {;}}", - # misra-c2012-13.4 - "$a int test(int x, int y) { return (x=2) && (y=2); }", - # misra-c2012-13.5 - "$a void test(int tmp) { if (true && tmp++) {;} }", - # misra-c2012-13.6 - "$a void test(int tmp) { if (sizeof(tmp++)) {;} }", - # misra-c2012-14.1 - "$a void test(float len) { for (float j = 0; j < len; j++) {;} }", - # misra-c2012-14.4 - "$a void test(int len) { if (len - 8) {;} }", - # misra-c2012-16.4 - r"$a void test(int temp) {switch (temp) { case 1: ; }}\n", - # misra-c2012-17.8 - "$a void test(int cnt) { for (cnt=0;;cnt++) {;} }", - # misra-c2012-20.4 - r"$a #define auto 1\n", - # misra-c2012-20.5 - r"$a #define TEST 1\n#undef TEST\n", -] - -all_files = glob.glob('opendbc/safety/**', root_dir=ROOT, recursive=True) -files = [f for f in all_files if f.endswith(('.c', '.h')) and not f.startswith(IGNORED_PATHS)] -assert len(files) > 20, files - -for p in patterns: - mutations.append((random.choice(files), p, True)) - -@pytest.mark.parametrize("fn, patch, should_fail", mutations) -def test_misra_mutation(fn, patch, should_fail): - with tempfile.TemporaryDirectory() as tmp: - shutil.copytree(ROOT, tmp, dirs_exist_ok=True) - shutil.rmtree(os.path.join(tmp, '.venv'), ignore_errors=True) - - # apply patch - if fn is not None: - r = os.system(f"cd {tmp} && sed -i '{patch}' {fn}") - assert r == 0 - - # run test - r = subprocess.run("SKIP_TABLES_DIFF=1 SKIP_BUILD=1 opendbc/safety/tests/misra/test_misra.sh", cwd=tmp, shell=True) - failed = r.returncode != 0 - assert failed == should_fail diff --git a/opendbc/safety/tests/mutation.sh b/opendbc/safety/tests/mutation.sh deleted file mode 100755 index 67bd396110e..00000000000 --- a/opendbc/safety/tests/mutation.sh +++ /dev/null @@ -1,16 +0,0 @@ -#!/usr/bin/env bash -set -e - -DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null && pwd)" -cd $DIR - -$DIR/install_mull.sh - -GIT_REF="${GIT_REF:-origin/master}" -GIT_ROOT=$(git rev-parse --show-toplevel) -MULL_OPS="mutators: [cxx_increment, cxx_decrement, cxx_comparison, cxx_boundary, cxx_bitwise_assignment, cxx_bitwise, cxx_arithmetic_assignment, cxx_arithmetic, cxx_remove_negation]" -echo -e "$MULL_OPS" > $GIT_ROOT/mull.yml -scons --mutation -j$(nproc) -D -echo -e "timeout: 10000\ngitDiffRef: $GIT_REF\ngitProjectRoot: $GIT_ROOT" >> $GIT_ROOT/mull.yml - -mull-runner-17 --ld-search-path /lib/x86_64-linux-gnu/ ./libsafety/libsafety.so -test-program=pytest -- -n8 diff --git a/opendbc/safety/tests/safety_replay/__init__.py b/opendbc/safety/tests/safety_replay/__init__.py deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/opendbc/safety/tests/safety_replay/helpers.py b/opendbc/safety/tests/safety_replay/helpers.py deleted file mode 100644 index c56a15270fb..00000000000 --- a/opendbc/safety/tests/safety_replay/helpers.py +++ /dev/null @@ -1,98 +0,0 @@ -from opendbc.car.ford.values import FordSafetyFlags -from opendbc.car.toyota.values import ToyotaSafetyFlags -from opendbc.car.structs import CarParams -from opendbc.safety.tests.libsafety import libsafety_py - -def to_signed(d, bits): - ret = d - if d >= (1 << (bits - 1)): - ret = d - (1 << bits) - return ret - -def is_steering_msg(mode, param, addr): - ret = False - if mode in (CarParams.SafetyModel.hondaNidec, CarParams.SafetyModel.hondaBosch): - ret = (addr == 0xE4) or (addr == 0x194) or (addr == 0x33D) or (addr == 0x33DA) or (addr == 0x33DB) - elif mode == CarParams.SafetyModel.toyota: - ret = addr == (0x191 if param & ToyotaSafetyFlags.LTA else 0x2E4) - elif mode == CarParams.SafetyModel.gm: - ret = addr == 384 - elif mode == CarParams.SafetyModel.hyundai: - ret = addr == 832 - elif mode == CarParams.SafetyModel.hyundaiCanfd: - # TODO: other params - ret = addr == 0x50 - elif mode == CarParams.SafetyModel.chrysler: - ret = addr == 0x292 - elif mode == CarParams.SafetyModel.subaru: - ret = addr == 0x122 - elif mode == CarParams.SafetyModel.ford: - ret = addr == 0x3d6 if param & FordSafetyFlags.CANFD else addr == 0x3d3 - elif mode == CarParams.SafetyModel.nissan: - ret = addr == 0x169 - elif mode == CarParams.SafetyModel.rivian: - ret = addr == 0x120 - return ret - -def get_steer_value(mode, param, to_send): - # TODO: use CANParser - torque, angle = 0, 0 - if mode in (CarParams.SafetyModel.hondaNidec, CarParams.SafetyModel.hondaBosch): - torque = (to_send.data[0] << 8) | to_send.data[1] - torque = to_signed(torque, 16) - elif mode == CarParams.SafetyModel.toyota: - if param & ToyotaSafetyFlags.LTA: - angle = (to_send.data[1] << 8) | to_send.data[2] - angle = to_signed(angle, 16) - else: - torque = (to_send.data[1] << 8) | (to_send.data[2]) - torque = to_signed(torque, 16) - elif mode == CarParams.SafetyModel.gm: - torque = ((to_send.data[0] & 0x7) << 8) | to_send.data[1] - torque = to_signed(torque, 11) - elif mode == CarParams.SafetyModel.hyundai: - torque = (((to_send.data[3] & 0x7) << 8) | to_send.data[2]) - 1024 - elif mode == CarParams.SafetyModel.hyundaiCanfd: - torque = ((to_send.data[5] >> 1) | (to_send.data[6] & 0xF) << 7) - 1024 - elif mode == CarParams.SafetyModel.chrysler: - torque = (((to_send.data[0] & 0x7) << 8) | to_send.data[1]) - 1024 - elif mode == CarParams.SafetyModel.subaru: - torque = ((to_send.data[3] & 0x1F) << 8) | to_send.data[2] - torque = -to_signed(torque, 13) - elif mode == CarParams.SafetyModel.ford: - if param & FordSafetyFlags.CANFD: - angle = ((to_send.data[2] << 3) | (to_send.data[3] >> 5)) - 1000 - else: - angle = ((to_send.data[0] << 3) | (to_send.data[1] >> 5)) - 1000 - elif mode == CarParams.SafetyModel.nissan: - angle = (to_send.data[0] << 10) | (to_send.data[1] << 2) | (to_send.data[2] >> 6) - angle = -angle + (1310 * 100) - elif mode == CarParams.SafetyModel.rivian: - torque = ((to_send.data[2] << 3) | (to_send.data[3] >> 5)) - 1024 - return torque, angle - -def package_can_msg(msg): - return libsafety_py.make_CANPacket(msg.address, msg.src % 4, msg.dat) - -def init_segment(safety, msgs, mode, param): - sendcan = (msg for msg in msgs if msg.which() == 'sendcan') - steering_msgs = (can for msg in sendcan for can in msg.sendcan if is_steering_msg(mode, param, can.address)) - - msg = next(steering_msgs, None) - if msg is None: - print("no steering msgs found!") - return - - to_send = package_can_msg(msg) - torque, angle = get_steer_value(mode, param, to_send) - if torque != 0: - safety.set_controls_allowed(1) - safety.set_desired_torque_last(torque) - safety.set_rt_torque_last(torque) - safety.set_torque_meas(torque, torque) - safety.set_torque_driver(torque, torque) - elif angle != 0: - safety.set_controls_allowed(1) - safety.set_desired_angle_last(angle) - safety.set_angle_meas(angle, angle) - assert safety.safety_tx_hook(to_send), "failed to initialize panda safety for segment" diff --git a/opendbc/safety/tests/safety_replay/replay_drive.py b/opendbc/safety/tests/safety_replay/replay_drive.py deleted file mode 100755 index 36e958c7a9c..00000000000 --- a/opendbc/safety/tests/safety_replay/replay_drive.py +++ /dev/null @@ -1,96 +0,0 @@ -#!/usr/bin/env python3 -import argparse -from collections import Counter -from tqdm import tqdm - -from opendbc.car.carlog import carlog -from opendbc.safety.tests.libsafety import libsafety_py -from opendbc.safety.tests.safety_replay.helpers import package_can_msg, init_segment - -# replay a drive to check for safety violations -def replay_drive(msgs, safety_mode, param, alternative_experience): - safety = libsafety_py.libsafety - msgs.sort(key=lambda m: m.logMonoTime) - - err = safety.set_safety_hooks(safety_mode, param) - assert err == 0, "invalid safety mode: %d" % safety_mode - safety.set_alternative_experience(alternative_experience) - - init_segment(safety, msgs, safety_mode, param) - - rx_tot, rx_invalid, tx_tot, tx_blocked, tx_controls, tx_controls_blocked = 0, 0, 0, 0, 0, 0 - safety_tick_rx_invalid = False - blocked_addrs = Counter() - invalid_addrs = set() - - can_msgs = [m for m in msgs if m.which() in ('can', 'sendcan')] - start_t = can_msgs[0].logMonoTime - end_t = can_msgs[-1].logMonoTime - for msg in tqdm(can_msgs): - safety.set_timer((msg.logMonoTime // 1000) % 0xFFFFFFFF) - - # skip start and end of route, warm up/down period - if msg.logMonoTime - start_t > 1e9 and end_t - msg.logMonoTime > 1e9: - safety.safety_tick_current_safety_config() - safety_tick_rx_invalid |= not safety.safety_config_valid() or safety_tick_rx_invalid - - if msg.which() == 'sendcan': - for canmsg in msg.sendcan: - to_send = package_can_msg(canmsg) - sent = safety.safety_tx_hook(to_send) - if not sent: - tx_blocked += 1 - tx_controls_blocked += safety.get_controls_allowed() - blocked_addrs[canmsg.address] += 1 - - carlog.debug("blocked bus %d msg %d at %f" % (canmsg.src, canmsg.address, (msg.logMonoTime - start_t) / 1e9)) - tx_controls += safety.get_controls_allowed() - tx_tot += 1 - elif msg.which() == 'can': - # ignore msgs we sent - for canmsg in filter(lambda m: m.src < 128, msg.can): - to_push = package_can_msg(canmsg) - recv = safety.safety_rx_hook(to_push) - if not recv: - rx_invalid += 1 - invalid_addrs.add(canmsg.address) - rx_tot += 1 - - print("\nRX") - print("total rx msgs:", rx_tot) - print("invalid rx msgs:", rx_invalid) - print("safety tick rx invalid:", safety_tick_rx_invalid) - print("invalid addrs:", invalid_addrs) - print("\nTX") - print("total openpilot msgs:", tx_tot) - print("total msgs with controls allowed:", tx_controls) - print("blocked msgs:", tx_blocked) - print("blocked with controls allowed:", tx_controls_blocked) - print("blocked addrs:", blocked_addrs) - - return tx_controls_blocked == 0 and rx_invalid == 0 and not safety_tick_rx_invalid - -if __name__ == "__main__": - from openpilot.tools.lib.logreader import LogReader - - parser = argparse.ArgumentParser(description="Replay CAN messages from a route or segment through a safety mode", - formatter_class=argparse.ArgumentDefaultsHelpFormatter) - parser.add_argument("route_or_segment_name", nargs='+') - parser.add_argument("--mode", type=int, help="Override the safety mode from the log") - parser.add_argument("--param", type=int, help="Override the safety param from the log") - parser.add_argument("--alternative-experience", type=int, help="Override the alternative experience from the log") - args = parser.parse_args() - - lr = LogReader(args.route_or_segment_name[0]) - - if None in (args.mode, args.param, args.alternative_experience): - CP = lr.first('carParams') - if args.mode is None: - args.mode = CP.safetyConfigs[-1].safetyModel.raw - if args.param is None: - args.param = CP.safetyConfigs[-1].safetyParam - if args.alternative_experience is None: - args.alternative_experience = CP.alternativeExperience - - print(f"replaying {args.route_or_segment_name[0]} with safety mode {args.mode}, param {args.param}, alternative experience {args.alternative_experience}") - replay_drive(list(lr), args.mode, args.param, args.alternative_experience) diff --git a/opendbc/safety/tests/test.sh b/opendbc/safety/tests/test.sh deleted file mode 100755 index af695bb7fab..00000000000 --- a/opendbc/safety/tests/test.sh +++ /dev/null @@ -1,34 +0,0 @@ -#!/usr/bin/env bash -set -e - -DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null && pwd)" -cd $DIR - -source ../../../setup.sh - -# reset coverage data and generate gcc note file -rm -f ./libsafety/*.gcda -if [ "$1" == "--ubsan" ]; then - scons -j$(nproc) -D --coverage --ubsan -else - scons -j$(nproc) -D --coverage -fi - -# run safety tests and generate coverage data -pytest -n8 - -# generate and open report -if [ "$1" == "--report" ]; then - mkdir -p coverage-out - gcovr -r ../ --html-nested coverage-out/index.html - sensible-browser coverage-out/index.html -fi - -# test coverage -GCOV="gcovr -r ../ --fail-under-line=100 -e ^libsafety -e ^../board" -if ! GCOV_OUTPUT="$($GCOV)"; then - echo -e "FAILED:\n$GCOV_OUTPUT" - exit 1 -else - echo "SUCCESS: All checked files have 100% coverage!" -fi diff --git a/opendbc/safety/tests/test_body.py b/opendbc/safety/tests/test_body.py deleted file mode 100755 index 91b68187d2d..00000000000 --- a/opendbc/safety/tests/test_body.py +++ /dev/null @@ -1,70 +0,0 @@ -#!/usr/bin/env python3 -import unittest - -from opendbc.car.structs import CarParams -import opendbc.safety.tests.common as common -from opendbc.safety.tests.libsafety import libsafety_py -from opendbc.safety.tests.common import CANPackerPanda - - -class TestBody(common.PandaSafetyTest): - TX_MSGS = [[0x250, 0], [0x251, 0], [0x350, 0], [0x351, 0], - [0x1, 0], [0x1, 1], [0x1, 2], [0x1, 3]] - FWD_BUS_LOOKUP = {} - - def setUp(self): - self.packer = CANPackerPanda("comma_body") - self.safety = libsafety_py.libsafety - self.safety.set_safety_hooks(CarParams.SafetyModel.body, 0) - self.safety.init_tests() - - def _motors_data_msg(self, speed_l, speed_r): - values = {"SPEED_L": speed_l, "SPEED_R": speed_r} - return self.packer.make_can_msg_panda("MOTORS_DATA", 0, values) - - def _torque_cmd_msg(self, torque_l, torque_r): - values = {"TORQUE_L": torque_l, "TORQUE_R": torque_r} - return self.packer.make_can_msg_panda("TORQUE_CMD", 0, values) - - def _knee_torque_cmd_msg(self, torque_l, torque_r): - values = {"TORQUE_L": torque_l, "TORQUE_R": torque_r} - return self.packer.make_can_msg_panda("KNEE_TORQUE_CMD", 0, values) - - def _max_motor_rpm_cmd_msg(self, max_rpm_l, max_rpm_r): - values = {"MAX_RPM_L": max_rpm_l, "MAX_RPM_R": max_rpm_r} - return self.packer.make_can_msg_panda("MAX_MOTOR_RPM_CMD", 0, values) - - def test_rx_hook(self): - self.assertFalse(self.safety.get_controls_allowed()) - self.assertFalse(self.safety.get_vehicle_moving()) - - # controls allowed when we get MOTORS_DATA message - self.assertTrue(self._rx(self._torque_cmd_msg(0, 0))) - self.assertTrue(self.safety.get_vehicle_moving()) # always moving - self.assertFalse(self.safety.get_controls_allowed()) - - self.assertTrue(self._rx(self._motors_data_msg(0, 0))) - self.assertTrue(self.safety.get_vehicle_moving()) # always moving - self.assertTrue(self.safety.get_controls_allowed()) - - def test_tx_hook(self): - self.assertFalse(self._tx(self._torque_cmd_msg(0, 0))) - self.assertFalse(self._tx(self._knee_torque_cmd_msg(0, 0))) - self.safety.set_controls_allowed(True) - self.assertTrue(self._tx(self._torque_cmd_msg(0, 0))) - self.assertTrue(self._tx(self._knee_torque_cmd_msg(0, 0))) - - def test_can_flasher(self): - # CAN flasher always allowed - self.safety.set_controls_allowed(False) - self.assertTrue(self._tx(common.make_msg(0, 0x1, 8))) - - # 0xdeadfaceU enters CAN flashing mode for base & knee - for addr in (0x250, 0x350): - self.assertTrue(self._tx(common.make_msg(0, addr, dat=b'\xce\xfa\xad\xde\x1e\x0b\xb0\x0a'))) - self.assertFalse(self._tx(common.make_msg(0, addr, dat=b'\xce\xfa\xad\xde\x1e\x0b\xb0'))) # not correct data/len - self.assertFalse(self._tx(common.make_msg(0, addr + 1, dat=b'\xce\xfa\xad\xde\x1e\x0b\xb0\x0a'))) # wrong address - - -if __name__ == "__main__": - unittest.main() diff --git a/opendbc/safety/tests/test_chrysler.py b/opendbc/safety/tests/test_chrysler.py deleted file mode 100755 index 854c2f5f739..00000000000 --- a/opendbc/safety/tests/test_chrysler.py +++ /dev/null @@ -1,125 +0,0 @@ -#!/usr/bin/env python3 -import unittest - -from opendbc.car.chrysler.values import ChryslerSafetyFlags -from opendbc.car.structs import CarParams -from opendbc.safety.tests.libsafety import libsafety_py -import opendbc.safety.tests.common as common -from opendbc.safety.tests.common import CANPackerPanda - - -class TestChryslerSafety(common.PandaCarSafetyTest, common.MotorTorqueSteeringSafetyTest): - TX_MSGS = [[0x23B, 0], [0x292, 0], [0x2A6, 0]] - RELAY_MALFUNCTION_ADDRS = {0: (0x292,)} - FWD_BLACKLISTED_ADDRS = {2: [0x292, 0x2A6]} - - MAX_RATE_UP = 3 - MAX_RATE_DOWN = 3 - MAX_TORQUE = 261 - MAX_RT_DELTA = 112 - RT_INTERVAL = 250000 - MAX_TORQUE_ERROR = 80 - - LKAS_ACTIVE_VALUE = 1 - - DAS_BUS = 0 - - def setUp(self): - self.packer = CANPackerPanda("chrysler_pacifica_2017_hybrid_generated") - self.safety = libsafety_py.libsafety - self.safety.set_safety_hooks(CarParams.SafetyModel.chrysler, 0) - self.safety.init_tests() - - def _button_msg(self, cancel=False, resume=False): - values = {"ACC_Cancel": cancel, "ACC_Resume": resume} - return self.packer.make_can_msg_panda("CRUISE_BUTTONS", self.DAS_BUS, values) - - def _pcm_status_msg(self, enable): - values = {"ACC_ACTIVE": enable} - return self.packer.make_can_msg_panda("DAS_3", self.DAS_BUS, values) - - def _speed_msg(self, speed): - values = {"SPEED_LEFT": speed, "SPEED_RIGHT": speed} - return self.packer.make_can_msg_panda("SPEED_1", 0, values) - - def _user_gas_msg(self, gas): - values = {"Accelerator_Position": gas} - return self.packer.make_can_msg_panda("ECM_5", 0, values) - - def _user_brake_msg(self, brake): - values = {"Brake_Pedal_State": 1 if brake else 0} - return self.packer.make_can_msg_panda("ESP_1", 0, values) - - def _torque_meas_msg(self, torque): - values = {"EPS_TORQUE_MOTOR": torque} - return self.packer.make_can_msg_panda("EPS_2", 0, values) - - def _torque_cmd_msg(self, torque, steer_req=1): - values = {"STEERING_TORQUE": torque, "LKAS_CONTROL_BIT": self.LKAS_ACTIVE_VALUE if steer_req else 0} - return self.packer.make_can_msg_panda("LKAS_COMMAND", 0, values) - - def test_buttons(self): - for controls_allowed in (True, False): - self.safety.set_controls_allowed(controls_allowed) - - # resume only while controls allowed - self.assertEqual(controls_allowed, self._tx(self._button_msg(resume=True))) - - # can always cancel - self.assertTrue(self._tx(self._button_msg(cancel=True))) - - # only one button at a time - self.assertFalse(self._tx(self._button_msg(cancel=True, resume=True))) - self.assertFalse(self._tx(self._button_msg(cancel=False, resume=False))) - - -class TestChryslerRamDTSafety(TestChryslerSafety): - TX_MSGS = [[0xB1, 2], [0xA6, 0], [0xFA, 0]] - RELAY_MALFUNCTION_ADDRS = {0: (0xA6,)} - FWD_BLACKLISTED_ADDRS = {2: [0xA6, 0xFA]} - - MAX_RATE_UP = 6 - MAX_RATE_DOWN = 6 - MAX_TORQUE = 350 - - DAS_BUS = 2 - - LKAS_ACTIVE_VALUE = 2 - - def setUp(self): - self.packer = CANPackerPanda("chrysler_ram_dt_generated") - self.safety = libsafety_py.libsafety - self.safety.set_safety_hooks(CarParams.SafetyModel.chrysler, ChryslerSafetyFlags.RAM_DT) - self.safety.init_tests() - - def _speed_msg(self, speed): - values = {"Vehicle_Speed": speed} - return self.packer.make_can_msg_panda("ESP_8", 0, values) - -class TestChryslerRamHDSafety(TestChryslerSafety): - TX_MSGS = [[0x275, 0], [0x276, 0], [0x23A, 2]] - RELAY_MALFUNCTION_ADDRS = {0: (0x276,)} - FWD_BLACKLISTED_ADDRS = {2: [0x275, 0x276]} - - MAX_TORQUE = 361 - MAX_RATE_UP = 14 - MAX_RATE_DOWN = 14 - MAX_RT_DELTA = 182 - - DAS_BUS = 2 - - LKAS_ACTIVE_VALUE = 2 - - def setUp(self): - self.packer = CANPackerPanda("chrysler_ram_hd_generated") - self.safety = libsafety_py.libsafety - self.safety.set_safety_hooks(CarParams.SafetyModel.chrysler, ChryslerSafetyFlags.RAM_HD) - self.safety.init_tests() - - def _speed_msg(self, speed): - values = {"Vehicle_Speed": speed} - return self.packer.make_can_msg_panda("ESP_8", 0, values) - - -if __name__ == "__main__": - unittest.main() diff --git a/opendbc/safety/tests/test_defaults.py b/opendbc/safety/tests/test_defaults.py deleted file mode 100755 index e44a1cd0a45..00000000000 --- a/opendbc/safety/tests/test_defaults.py +++ /dev/null @@ -1,74 +0,0 @@ -#!/usr/bin/env python3 -import unittest - -import opendbc.safety.tests.common as common -from opendbc.car.structs import CarParams -from opendbc.safety.tests.libsafety import libsafety_py - - -class TestDefaultRxHookBase(common.PandaSafetyTest): - FWD_BUS_LOOKUP = {} - - def test_rx_hook(self): - # default rx hook allows all msgs - for bus in range(4): - for addr in self.SCANNED_ADDRS: - self.assertTrue(self._rx(common.make_msg(bus, addr, 8)), f"failed RX {addr=}") - - -class TestNoOutput(TestDefaultRxHookBase): - TX_MSGS = [] - - def setUp(self): - self.safety = libsafety_py.libsafety - self.safety.set_safety_hooks(CarParams.SafetyModel.noOutput, 0) - self.safety.init_tests() - - -class TestSilent(TestNoOutput): - """SILENT uses same hooks as NOOUTPUT""" - - def setUp(self): - self.safety = libsafety_py.libsafety - self.safety.set_safety_hooks(CarParams.SafetyModel.silent, 0) - self.safety.init_tests() - - -class TestAllOutput(TestDefaultRxHookBase): - # Allow all messages - TX_MSGS = [[addr, bus] for addr in common.PandaSafetyTest.SCANNED_ADDRS - for bus in range(4)] - - def setUp(self): - self.safety = libsafety_py.libsafety - self.safety.set_safety_hooks(CarParams.SafetyModel.allOutput, 0) - self.safety.init_tests() - - def test_spam_can_buses(self): - # asserts tx allowed for all scanned addrs - for bus in range(4): - for addr in self.SCANNED_ADDRS: - should_tx = [addr, bus] in self.TX_MSGS - self.assertEqual(should_tx, self._tx(common.make_msg(bus, addr, 8)), f"allowed TX {addr=} {bus=}") - - def test_default_controls_not_allowed(self): - # controls always allowed - self.assertTrue(self.safety.get_controls_allowed()) - - def test_tx_hook_on_wrong_safety_mode(self): - # No point, since we allow all messages - pass - - -class TestAllOutputPassthrough(TestAllOutput): - FWD_BLACKLISTED_ADDRS = {} - FWD_BUS_LOOKUP = {0: 2, 2: 0} - - def setUp(self): - self.safety = libsafety_py.libsafety - self.safety.set_safety_hooks(CarParams.SafetyModel.allOutput, 1) - self.safety.init_tests() - - -if __name__ == "__main__": - unittest.main() diff --git a/opendbc/safety/tests/test_elm327.py b/opendbc/safety/tests/test_elm327.py deleted file mode 100755 index a499a051c4a..00000000000 --- a/opendbc/safety/tests/test_elm327.py +++ /dev/null @@ -1,49 +0,0 @@ -#!/usr/bin/env python3 -import unittest - -import opendbc.safety.tests.common as common -from opendbc.car.structs import CarParams -from opendbc.safety import DLC_TO_LEN -from opendbc.safety.tests.libsafety import libsafety_py -from opendbc.safety.tests.test_defaults import TestDefaultRxHookBase - -GM_CAMERA_DIAG_ADDR = 0x24B - - -class TestElm327(TestDefaultRxHookBase): - TX_MSGS = [[addr, bus] for addr in [GM_CAMERA_DIAG_ADDR, *range(0x600, 0x800), - *range(0x18DA00F1, 0x18DB00F1, 0x100), # 29-bit UDS physical addressing - *[0x18DB33F1], # 29-bit UDS functional address - ] for bus in range(4)] - FWD_BUS_LOOKUP = {} - - def setUp(self): - self.safety = libsafety_py.libsafety - self.safety.set_safety_hooks(CarParams.SafetyModel.elm327, 0) - self.safety.init_tests() - - def test_tx_hook(self): - # ensure we can transmit arbitrary data on allowed addresses - for bus in range(4): - for addr in self.SCANNED_ADDRS: - should_tx = [addr, bus] in self.TX_MSGS - self.assertEqual(should_tx, self._tx(common.make_msg(bus, addr, 8))) - - # ELM only allows 8 byte UDS/KWP messages under ISO 15765-4 - for msg_len in DLC_TO_LEN: - should_tx = msg_len == 8 - self.assertEqual(should_tx, self._tx(common.make_msg(0, 0x700, msg_len))) - - # TODO: perform this check for all addresses - # 4 to 15 are reserved ISO-TP frame types (https://en.wikipedia.org/wiki/ISO_15765-2) - for byte in range(0xff): - should_tx = (byte >> 4) <= 3 - self.assertEqual(should_tx, self._tx(common.make_msg(0, GM_CAMERA_DIAG_ADDR, dat=bytes([byte] * 8)))) - - def test_tx_hook_on_wrong_safety_mode(self): - # No point, since we allow many diagnostic addresses - pass - - -if __name__ == "__main__": - unittest.main() diff --git a/opendbc/safety/tests/test_ford.py b/opendbc/safety/tests/test_ford.py deleted file mode 100755 index 744112fd660..00000000000 --- a/opendbc/safety/tests/test_ford.py +++ /dev/null @@ -1,514 +0,0 @@ -#!/usr/bin/env python3 -import numpy as np -import random -import unittest - -import opendbc.safety.tests.common as common -from opendbc.car.ford.carcontroller import MAX_LATERAL_ACCEL -from opendbc.car.ford.values import FordSafetyFlags -from opendbc.car.structs import CarParams -from opendbc.safety.tests.libsafety import libsafety_py -from opendbc.safety.tests.common import CANPackerPanda - -MSG_EngBrakeData = 0x165 # RX from PCM, for driver brake pedal and cruise state -MSG_EngVehicleSpThrottle = 0x204 # RX from PCM, for driver throttle input -MSG_BrakeSysFeatures = 0x415 # RX from ABS, for vehicle speed -MSG_EngVehicleSpThrottle2 = 0x202 # RX from PCM, for second vehicle speed -MSG_Yaw_Data_FD1 = 0x91 # RX from RCM, for yaw rate -MSG_Steering_Data_FD1 = 0x083 # TX by OP, various driver switches and LKAS/CC buttons -MSG_ACCDATA = 0x186 # TX by OP, ACC controls -MSG_ACCDATA_3 = 0x18A # TX by OP, ACC/TJA user interface -MSG_Lane_Assist_Data1 = 0x3CA # TX by OP, Lane Keep Assist -MSG_LateralMotionControl = 0x3D3 # TX by OP, Lateral Control message -MSG_LateralMotionControl2 = 0x3D6 # TX by OP, alternate Lateral Control message -MSG_IPMA_Data = 0x3D8 # TX by OP, IPMA and LKAS user interface - - -def checksum(msg): - addr, dat, bus = msg - ret = bytearray(dat) - - if addr == MSG_Yaw_Data_FD1: - chksum = dat[0] + dat[1] # VehRol_W_Actl - chksum += dat[2] + dat[3] # VehYaw_W_Actl - chksum += dat[5] # VehRollYaw_No_Cnt - chksum += dat[6] >> 6 # VehRolWActl_D_Qf - chksum += (dat[6] >> 4) & 0x3 # VehYawWActl_D_Qf - chksum = 0xff - (chksum & 0xff) - ret[4] = chksum - - elif addr == MSG_BrakeSysFeatures: - chksum = dat[0] + dat[1] # Veh_V_ActlBrk - chksum += (dat[2] >> 2) & 0xf # VehVActlBrk_No_Cnt - chksum += dat[2] >> 6 # VehVActlBrk_D_Qf - chksum = 0xff - (chksum & 0xff) - ret[3] = chksum - - elif addr == MSG_EngVehicleSpThrottle2: - chksum = (dat[2] >> 3) & 0xf # VehVActlEng_No_Cnt - chksum += (dat[4] >> 5) & 0x3 # VehVActlEng_D_Qf - chksum += dat[6] + dat[7] # Veh_V_ActlEng - chksum = 0xff - (chksum & 0xff) - ret[1] = chksum - - return addr, ret, bus - - -class Buttons: - CANCEL = 0 - RESUME = 1 - TJA_TOGGLE = 2 - - -# Ford safety has four different configurations tested here: -# * CAN with openpilot longitudinal -# * CAN FD with stock longitudinal -# * CAN FD with openpilot longitudinal - -class TestFordSafetyBase(common.PandaCarSafetyTest): - STANDSTILL_THRESHOLD = 1 - RELAY_MALFUNCTION_ADDRS = {0: (MSG_ACCDATA_3, MSG_Lane_Assist_Data1, MSG_LateralMotionControl, - MSG_LateralMotionControl2, MSG_IPMA_Data)} - - FWD_BLACKLISTED_ADDRS = {2: [MSG_ACCDATA_3, MSG_Lane_Assist_Data1, MSG_LateralMotionControl, - MSG_LateralMotionControl2, MSG_IPMA_Data]} - - # Max allowed delta between car speeds - MAX_SPEED_DELTA = 2.0 # m/s - - STEER_MESSAGE = 0 - - # Curvature control limits - DEG_TO_CAN = 50000 # 1 / (2e-5) rad to can - MAX_CURVATURE = 0.02 - MAX_CURVATURE_ERROR = 0.002 - CURVATURE_ERROR_MIN_SPEED = 10.0 # m/s - - ANGLE_RATE_BP = [5., 25., 25.] - ANGLE_RATE_UP = [0.00045, 0.0001, 0.0001] # windup limit - ANGLE_RATE_DOWN = [0.00045, 0.00015, 0.00015] # unwind limit - - cnt_speed = 0 - cnt_speed_2 = 0 - cnt_yaw_rate = 0 - - packer: CANPackerPanda - safety: libsafety_py.Panda - - @classmethod - def setUpClass(cls): - if cls.__name__ == "TestFordSafetyBase": - raise unittest.SkipTest - - def get_canfd_curvature_limits(self, speed): - # Round it in accordance with the safety - curvature_accel_limit = MAX_LATERAL_ACCEL / (max(speed, 1) ** 2) - curvature_accel_limit_lower = int(curvature_accel_limit * self.DEG_TO_CAN - 1) / self.DEG_TO_CAN - curvature_accel_limit_upper = int(curvature_accel_limit * self.DEG_TO_CAN + 1) / self.DEG_TO_CAN - return curvature_accel_limit_lower, curvature_accel_limit_upper - - def _set_prev_desired_angle(self, t): - t = round(t * self.DEG_TO_CAN) - self.safety.set_desired_angle_last(t) - - def _reset_curvature_measurement(self, curvature, speed): - for _ in range(6): - self._rx(self._speed_msg(speed)) - self._rx(self._yaw_rate_msg(curvature, speed)) - - # Driver brake pedal - def _user_brake_msg(self, brake: bool): - # brake pedal and cruise state share same message, so we have to send - # the other signal too - enable = self.safety.get_controls_allowed() - values = { - "BpedDrvAppl_D_Actl": 2 if brake else 1, - "CcStat_D_Actl": 5 if enable else 0, - } - return self.packer.make_can_msg_panda("EngBrakeData", 0, values) - - # ABS vehicle speed - def _speed_msg(self, speed: float, quality_flag=True): - values = {"Veh_V_ActlBrk": speed * 3.6, "VehVActlBrk_D_Qf": 3 if quality_flag else 0, "VehVActlBrk_No_Cnt": self.cnt_speed % 16} - self.__class__.cnt_speed += 1 - return self.packer.make_can_msg_panda("BrakeSysFeatures", 0, values, fix_checksum=checksum) - - # PCM vehicle speed - def _speed_msg_2(self, speed: float, quality_flag=True): - values = {"Veh_V_ActlEng": speed * 3.6, "VehVActlEng_D_Qf": 3 if quality_flag else 0, "VehVActlEng_No_Cnt": self.cnt_speed_2 % 16} - self.__class__.cnt_speed_2 += 1 - return self.packer.make_can_msg_panda("EngVehicleSpThrottle2", 0, values, fix_checksum=checksum) - - # Standstill state - def _vehicle_moving_msg(self, speed: float): - values = {"VehStop_D_Stat": 1 if speed <= self.STANDSTILL_THRESHOLD else random.choice((0, 2, 3))} - return self.packer.make_can_msg_panda("DesiredTorqBrk", 0, values) - - # Current curvature - def _yaw_rate_msg(self, curvature: float, speed: float, quality_flag=True): - values = {"VehYaw_W_Actl": curvature * speed, "VehYawWActl_D_Qf": 3 if quality_flag else 0, - "VehRollYaw_No_Cnt": self.cnt_yaw_rate % 256} - self.__class__.cnt_yaw_rate += 1 - return self.packer.make_can_msg_panda("Yaw_Data_FD1", 0, values, fix_checksum=checksum) - - # Drive throttle input - def _user_gas_msg(self, gas: float): - values = {"ApedPos_Pc_ActlArb": gas} - return self.packer.make_can_msg_panda("EngVehicleSpThrottle", 0, values) - - # Cruise status - def _pcm_status_msg(self, enable: bool): - # brake pedal and cruise state share same message, so we have to send - # the other signal too - brake = self.safety.get_brake_pressed_prev() - values = { - "BpedDrvAppl_D_Actl": 2 if brake else 1, - "CcStat_D_Actl": 5 if enable else 0, - } - return self.packer.make_can_msg_panda("EngBrakeData", 0, values) - - # LKAS command - def _lkas_command_msg(self, action: int): - values = { - "LkaActvStats_D2_Req": action, - } - return self.packer.make_can_msg_panda("Lane_Assist_Data1", 0, values) - - # LCA command - def _lat_ctl_msg(self, enabled: bool, path_offset: float, path_angle: float, curvature: float, curvature_rate: float): - if self.STEER_MESSAGE == MSG_LateralMotionControl: - values = { - "LatCtl_D_Rq": 1 if enabled else 0, - "LatCtlPathOffst_L_Actl": path_offset, # Path offset [-5.12|5.11] meter - "LatCtlPath_An_Actl": path_angle, # Path angle [-0.5|0.5235] radians - "LatCtlCurv_NoRate_Actl": curvature_rate, # Curvature rate [-0.001024|0.00102375] 1/meter^2 - "LatCtlCurv_No_Actl": curvature, # Curvature [-0.02|0.02094] 1/meter - } - return self.packer.make_can_msg_panda("LateralMotionControl", 0, values) - elif self.STEER_MESSAGE == MSG_LateralMotionControl2: - values = { - "LatCtl_D2_Rq": 1 if enabled else 0, - "LatCtlPathOffst_L_Actl": path_offset, # Path offset [-5.12|5.11] meter - "LatCtlPath_An_Actl": path_angle, # Path angle [-0.5|0.5235] radians - "LatCtlCrv_NoRate2_Actl": curvature_rate, # Curvature rate [-0.001024|0.001023] 1/meter^2 - "LatCtlCurv_No_Actl": curvature, # Curvature [-0.02|0.02094] 1/meter - } - return self.packer.make_can_msg_panda("LateralMotionControl2", 0, values) - - # Cruise control buttons - def _acc_button_msg(self, button: int, bus: int): - values = { - "CcAslButtnCnclPress": 1 if button == Buttons.CANCEL else 0, - "CcAsllButtnResPress": 1 if button == Buttons.RESUME else 0, - "TjaButtnOnOffPress": 1 if button == Buttons.TJA_TOGGLE else 0, - } - return self.packer.make_can_msg_panda("Steering_Data_FD1", bus, values) - - def test_rx_hook(self): - # checksum, counter, and quality flag checks - for quality_flag in [True, False]: - for msg in ["speed", "speed_2", "yaw"]: - self.safety.set_controls_allowed(True) - # send multiple times to verify counter checks - for _ in range(10): - if msg == "speed": - to_push = self._speed_msg(0, quality_flag=quality_flag) - elif msg == "speed_2": - to_push = self._speed_msg_2(0, quality_flag=quality_flag) - elif msg == "yaw": - to_push = self._yaw_rate_msg(0, 0, quality_flag=quality_flag) - - self.assertEqual(quality_flag, self._rx(to_push)) - self.assertEqual(quality_flag, self.safety.get_controls_allowed()) - - # Mess with checksum to make it fail, checksum is not checked for 2nd speed - to_push[0].data[3] = 0 # Speed checksum & half of yaw signal - should_rx = msg == "speed_2" and quality_flag - self.assertEqual(should_rx, self._rx(to_push)) - self.assertEqual(should_rx, self.safety.get_controls_allowed()) - - def test_rx_hook_speed_mismatch(self): - # Ford relies on speed for driver curvature limiting, so it checks two sources - for speed in np.arange(0, 40, 0.5): - for speed_delta in np.arange(-5, 5, 0.1): - speed_2 = round(max(speed + speed_delta, 0), 1) - # Set controls allowed in between rx since first message can reset it - self._rx(self._speed_msg(speed)) - self.safety.set_controls_allowed(True) - self._rx(self._speed_msg_2(speed_2)) - - within_delta = abs(speed - speed_2) <= self.MAX_SPEED_DELTA - self.assertEqual(self.safety.get_controls_allowed(), within_delta) - - def test_angle_measurements(self): - """Tests rx hook correctly parses the curvature measurement from the vehicle speed and yaw rate""" - for speed in np.arange(0.5, 40, 0.5): - for curvature in np.arange(0, self.MAX_CURVATURE * 2, 2e-3): - self._rx(self._speed_msg(speed)) - for c in (curvature, -curvature, 0, 0, 0, 0): - self._rx(self._yaw_rate_msg(c, speed)) - - self.assertEqual(self.safety.get_angle_meas_min(), round(-curvature * self.DEG_TO_CAN)) - self.assertEqual(self.safety.get_angle_meas_max(), round(curvature * self.DEG_TO_CAN)) - - self._rx(self._yaw_rate_msg(0, speed)) - self.assertEqual(self.safety.get_angle_meas_min(), round(-curvature * self.DEG_TO_CAN)) - self.assertEqual(self.safety.get_angle_meas_max(), 0) - - self._rx(self._yaw_rate_msg(0, speed)) - self.assertEqual(self.safety.get_angle_meas_min(), 0) - self.assertEqual(self.safety.get_angle_meas_max(), 0) - - def test_max_lateral_acceleration(self): - # Ford CAN FD can achieve a higher max lateral acceleration than CAN so we limit curvature based on speed - for speed in np.arange(0, 40, 0.5): - # Clip so we test curvature limiting at low speed due to low max curvature - _, curvature_accel_limit_upper = self.get_canfd_curvature_limits(speed) - curvature_accel_limit_upper = np.clip(curvature_accel_limit_upper, -self.MAX_CURVATURE, self.MAX_CURVATURE) - - for sign in (-1, 1): - # Test above and below the lateral by 20%, max is clipped since - # max curvature at low speed is higher than the signal max - for curvature in np.arange(curvature_accel_limit_upper * 0.8, min(curvature_accel_limit_upper * 1.2, self.MAX_CURVATURE), 1 / self.DEG_TO_CAN): - curvature = sign * round(curvature * self.DEG_TO_CAN) / self.DEG_TO_CAN # fix np rounding errors - self.safety.set_controls_allowed(True) - self._set_prev_desired_angle(curvature) - self._reset_curvature_measurement(curvature, speed) - - should_tx = abs(curvature) <= curvature_accel_limit_upper - self.assertEqual(should_tx, self._tx(self._lat_ctl_msg(True, 0, 0, curvature, 0))) - - def test_steer_allowed(self): - path_offsets = np.arange(-5.12, 5.11, 2.5).round() - path_angles = np.arange(-0.5, 0.5235, 0.25).round(1) - curvature_rates = np.arange(-0.001024, 0.00102375, 0.001).round(3) - curvatures = np.arange(-0.02, 0.02094, 0.01).round(2) - - for speed in (self.CURVATURE_ERROR_MIN_SPEED - 1, - self.CURVATURE_ERROR_MIN_SPEED + 1): - _, curvature_accel_limit_upper = self.get_canfd_curvature_limits(speed) - for controls_allowed in (True, False): - for steer_control_enabled in (True, False): - for path_offset in path_offsets: - for path_angle in path_angles: - for curvature_rate in curvature_rates: - for curvature in curvatures: - self.safety.set_controls_allowed(controls_allowed) - self._set_prev_desired_angle(curvature) - self._reset_curvature_measurement(curvature, speed) - - should_tx = path_offset == 0 and path_angle == 0 and curvature_rate == 0 - # when request bit is 0, only allow curvature of 0 since the signal range - # is not large enough to enforce it tracking measured - should_tx = should_tx and (controls_allowed if steer_control_enabled else curvature == 0) - - # Only CAN FD has the max lateral acceleration limit - if self.STEER_MESSAGE == MSG_LateralMotionControl2: - should_tx = should_tx and abs(curvature) <= curvature_accel_limit_upper - - with self.subTest(controls_allowed=controls_allowed, steer_control_enabled=steer_control_enabled, - path_offset=path_offset, path_angle=path_angle, curvature_rate=curvature_rate, - curvature=curvature): - self.assertEqual(should_tx, self._tx(self._lat_ctl_msg(steer_control_enabled, path_offset, path_angle, curvature, curvature_rate))) - - def test_curvature_rate_limits(self): - """ - When the curvature error is exceeded, commanded curvature must start moving towards meas respecting rate limits. - Since panda allows higher rate limits to avoid false positives, we need to allow a lower rate to move towards meas. - """ - self.safety.set_controls_allowed(True) - # safety fudges the speed (1 m/s) and rate limits (1 CAN unit) to avoid false positives - small_curvature = 1 / self.DEG_TO_CAN # significant small amount of curvature to cross boundary - - for speed in np.arange(0, 40, 0.5): - curvature_accel_limit_lower, curvature_accel_limit_upper = self.get_canfd_curvature_limits(speed) - limit_command = speed > self.CURVATURE_ERROR_MIN_SPEED - # ensure our limits match the safety's rounded limits - max_delta_up = int(np.interp(speed - 1, self.ANGLE_RATE_BP, self.ANGLE_RATE_UP) * self.DEG_TO_CAN + 1) / self.DEG_TO_CAN - max_delta_up_lower = int(np.interp(speed + 1, self.ANGLE_RATE_BP, self.ANGLE_RATE_UP) * self.DEG_TO_CAN - 1) / self.DEG_TO_CAN - - max_delta_down = int(np.interp(speed - 1, self.ANGLE_RATE_BP, self.ANGLE_RATE_DOWN) * self.DEG_TO_CAN + 1 + 1e-3) / self.DEG_TO_CAN - max_delta_down_lower = int(np.interp(speed + 1, self.ANGLE_RATE_BP, self.ANGLE_RATE_DOWN) * self.DEG_TO_CAN - 1 + 1e-3) / self.DEG_TO_CAN - - up_cases = (self.MAX_CURVATURE_ERROR * 2, [ - (not limit_command, 0, 0), - (not limit_command, 0, max_delta_up_lower - small_curvature), - (True, 1e-9, max_delta_down), # TODO: safety should not allow down limits at 0 - (not limit_command, 1e-9, max_delta_up_lower), # TODO: safety should not allow down limits at 0 - (True, 0, max_delta_up_lower), - (True, 0, max_delta_up), - (False, 0, max_delta_up + small_curvature), - # stay at boundary limit - (True, self.MAX_CURVATURE_ERROR - small_curvature, self.MAX_CURVATURE_ERROR - small_curvature), - # 1 unit below boundary limit - (not limit_command, self.MAX_CURVATURE_ERROR - small_curvature * 2, self.MAX_CURVATURE_ERROR - small_curvature * 2), - # shouldn't allow command to move outside the boundary limit if last was inside - (not limit_command, self.MAX_CURVATURE_ERROR - small_curvature, self.MAX_CURVATURE_ERROR - small_curvature * 2), - ]) - - down_cases = (self.MAX_CURVATURE - self.MAX_CURVATURE_ERROR * 2, [ - (not limit_command, self.MAX_CURVATURE, self.MAX_CURVATURE), - (not limit_command, self.MAX_CURVATURE, self.MAX_CURVATURE - max_delta_down_lower + small_curvature), - (True, self.MAX_CURVATURE, self.MAX_CURVATURE - max_delta_down_lower), - (True, self.MAX_CURVATURE, self.MAX_CURVATURE - max_delta_down), - (False, self.MAX_CURVATURE, self.MAX_CURVATURE - max_delta_down - small_curvature), - ]) - - for sign in (-1, 1): - for angle_meas, cases in (up_cases, down_cases): - self._reset_curvature_measurement(sign * angle_meas, speed) - for should_tx, initial_curvature, desired_curvature in cases: - - # Only CAN FD has the max lateral acceleration limit - if self.STEER_MESSAGE == MSG_LateralMotionControl2: - if should_tx: - # can not send if the curvature is above the max lateral acceleration - should_tx = should_tx and abs(desired_curvature) <= curvature_accel_limit_upper - else: - # if desired curvature violates driver curvature error, it can only send if - # the curvature is being limited by max lateral acceleration - should_tx = should_tx or curvature_accel_limit_lower <= abs(desired_curvature) <= curvature_accel_limit_upper - - # small curvature ensures we're using up limits. at 0, safety allows down limits to allow to account for rounding errors - curvature_offset = small_curvature if initial_curvature == 0 else 0 - self._set_prev_desired_angle(sign * (curvature_offset + initial_curvature)) - self.assertEqual(should_tx, self._tx(self._lat_ctl_msg(True, 0, 0, sign * (curvature_offset + desired_curvature), 0))) - - def test_prevent_lkas_action(self): - self.safety.set_controls_allowed(1) - self.assertFalse(self._tx(self._lkas_command_msg(1))) - - self.safety.set_controls_allowed(0) - self.assertFalse(self._tx(self._lkas_command_msg(1))) - - def test_acc_buttons(self): - for allowed in (0, 1): - self.safety.set_controls_allowed(allowed) - for enabled in (True, False): - self._rx(self._pcm_status_msg(enabled)) - self.assertTrue(self._tx(self._acc_button_msg(Buttons.TJA_TOGGLE, 2))) - - for allowed in (0, 1): - self.safety.set_controls_allowed(allowed) - for bus in (0, 2): - self.assertEqual(allowed, self._tx(self._acc_button_msg(Buttons.RESUME, bus))) - - for enabled in (True, False): - self._rx(self._pcm_status_msg(enabled)) - for bus in (0, 2): - self.assertEqual(enabled, self._tx(self._acc_button_msg(Buttons.CANCEL, bus))) - - -class TestFordCANFDStockSafety(TestFordSafetyBase): - STEER_MESSAGE = MSG_LateralMotionControl2 - - TX_MSGS = [ - [MSG_Steering_Data_FD1, 0], [MSG_Steering_Data_FD1, 2], [MSG_ACCDATA_3, 0], [MSG_Lane_Assist_Data1, 0], - [MSG_LateralMotionControl2, 0], [MSG_IPMA_Data, 0], - ] - - def setUp(self): - self.packer = CANPackerPanda("ford_lincoln_base_pt") - self.safety = libsafety_py.libsafety - self.safety.set_safety_hooks(CarParams.SafetyModel.ford, FordSafetyFlags.CANFD) - self.safety.init_tests() - - -class TestFordLongitudinalSafetyBase(TestFordSafetyBase): - RELAY_MALFUNCTION_ADDRS = {0: (MSG_ACCDATA, MSG_ACCDATA_3, MSG_Lane_Assist_Data1, MSG_LateralMotionControl, - MSG_LateralMotionControl2, MSG_IPMA_Data)} - - FWD_BLACKLISTED_ADDRS = {2: [MSG_ACCDATA, MSG_ACCDATA_3, MSG_Lane_Assist_Data1, MSG_LateralMotionControl, - MSG_LateralMotionControl2, MSG_IPMA_Data]} - - MAX_ACCEL = 2.0 # accel is used for brakes, but openpilot can set positive values - MIN_ACCEL = -3.5 - INACTIVE_ACCEL = 0.0 - - MAX_GAS = 2.0 - MIN_GAS = -0.5 - INACTIVE_GAS = -5.0 - - @classmethod - def setUpClass(cls): - if cls.__name__ == "TestFordLongitudinalSafetyBase": - raise unittest.SkipTest - - # ACC command - def _acc_command_msg(self, gas: float, brake: float, brake_actuation: bool, cmbb_deny: bool = False): - values = { - "AccPrpl_A_Rq": gas, # [-5|5.23] m/s^2 - "AccPrpl_A_Pred": gas, # [-5|5.23] m/s^2 - "AccBrkTot_A_Rq": brake, # [-20|11.9449] m/s^2 - "AccBrkPrchg_B_Rq": 1 if brake_actuation else 0, # Pre-charge brake request: 0=No, 1=Yes - "AccBrkDecel_B_Rq": 1 if brake_actuation else 0, # Deceleration request: 0=Inactive, 1=Active - "CmbbDeny_B_Actl": 1 if cmbb_deny else 0, # [0|1] deny AEB actuation - } - return self.packer.make_can_msg_panda("ACCDATA", 0, values) - - def test_stock_aeb(self): - # Test that CmbbDeny_B_Actl is never 1, it prevents the ABS module from actuating AEB requests from ACCDATA_2 - for controls_allowed in (True, False): - self.safety.set_controls_allowed(controls_allowed) - for cmbb_deny in (True, False): - should_tx = not cmbb_deny - self.assertEqual(should_tx, self._tx(self._acc_command_msg(self.INACTIVE_GAS, self.INACTIVE_ACCEL, controls_allowed, cmbb_deny))) - should_tx = controls_allowed and not cmbb_deny - self.assertEqual(should_tx, self._tx(self._acc_command_msg(self.MAX_GAS, self.MAX_ACCEL, controls_allowed, cmbb_deny))) - - def test_gas_safety_check(self): - for controls_allowed in (True, False): - self.safety.set_controls_allowed(controls_allowed) - for gas in np.concatenate((np.arange(self.MIN_GAS - 2, self.MAX_GAS + 2, 0.05), [self.INACTIVE_GAS])): - gas = round(gas, 2) # floats might not hit exact boundary conditions without rounding - should_tx = (controls_allowed and self.MIN_GAS <= gas <= self.MAX_GAS) or gas == self.INACTIVE_GAS - self.assertEqual(should_tx, self._tx(self._acc_command_msg(gas, self.INACTIVE_ACCEL, controls_allowed))) - - def test_brake_safety_check(self): - for controls_allowed in (True, False): - self.safety.set_controls_allowed(controls_allowed) - for brake_actuation in (True, False): - for brake in np.arange(self.MIN_ACCEL - 2, self.MAX_ACCEL + 2, 0.05): - brake = round(brake, 2) # floats might not hit exact boundary conditions without rounding - should_tx = (controls_allowed and self.MIN_ACCEL <= brake <= self.MAX_ACCEL) or brake == self.INACTIVE_ACCEL - should_tx = should_tx and (controls_allowed or not brake_actuation) - self.assertEqual(should_tx, self._tx(self._acc_command_msg(self.INACTIVE_GAS, brake, brake_actuation))) - - -class TestFordLongitudinalSafety(TestFordLongitudinalSafetyBase): - STEER_MESSAGE = MSG_LateralMotionControl - - TX_MSGS = [ - [MSG_Steering_Data_FD1, 0], [MSG_Steering_Data_FD1, 2], [MSG_ACCDATA, 0], [MSG_ACCDATA_3, 0], [MSG_Lane_Assist_Data1, 0], - [MSG_LateralMotionControl, 0], [MSG_IPMA_Data, 0], - ] - - def setUp(self): - self.packer = CANPackerPanda("ford_lincoln_base_pt") - self.safety = libsafety_py.libsafety - # Make sure we enforce long safety even without long flag for CAN - self.safety.set_safety_hooks(CarParams.SafetyModel.ford, 0) - self.safety.init_tests() - - def test_max_lateral_acceleration(self): - # CAN does not limit curvature from lateral acceleration - pass - - -class TestFordCANFDLongitudinalSafety(TestFordLongitudinalSafetyBase): - STEER_MESSAGE = MSG_LateralMotionControl2 - - TX_MSGS = [ - [MSG_Steering_Data_FD1, 0], [MSG_Steering_Data_FD1, 2], [MSG_ACCDATA, 0], [MSG_ACCDATA_3, 0], [MSG_Lane_Assist_Data1, 0], - [MSG_LateralMotionControl2, 0], [MSG_IPMA_Data, 0], - ] - - def setUp(self): - self.packer = CANPackerPanda("ford_lincoln_base_pt") - self.safety = libsafety_py.libsafety - self.safety.set_safety_hooks(CarParams.SafetyModel.ford, FordSafetyFlags.LONG_CONTROL | FordSafetyFlags.CANFD) - self.safety.init_tests() - - -if __name__ == "__main__": - unittest.main() diff --git a/opendbc/safety/tests/test_gm.py b/opendbc/safety/tests/test_gm.py deleted file mode 100755 index 988be81a9cb..00000000000 --- a/opendbc/safety/tests/test_gm.py +++ /dev/null @@ -1,228 +0,0 @@ -#!/usr/bin/env python3 -import unittest - -from opendbc.car.gm.values import GMSafetyFlags -from opendbc.car.structs import CarParams -from opendbc.safety.tests.libsafety import libsafety_py -import opendbc.safety.tests.common as common -from opendbc.safety.tests.common import CANPackerPanda - - -class Buttons: - UNPRESS = 1 - RES_ACCEL = 2 - DECEL_SET = 3 - CANCEL = 6 - - -class GmLongitudinalBase(common.PandaCarSafetyTest, common.LongitudinalGasBrakeSafetyTest): - # pylint: disable=no-member,abstract-method - - RELAY_MALFUNCTION_ADDRS = {0: (0x180, 0x2CB)} # ASCMLKASteeringCmd, ASCMGasRegenCmd - - MAX_POSSIBLE_BRAKE = 2 ** 12 - MAX_BRAKE = 400 - - MAX_POSSIBLE_GAS = 2 ** 12 - - PCM_CRUISE = False # openpilot can control the PCM state if longitudinal - - def _send_brake_msg(self, brake): - values = {"FrictionBrakeCmd": -brake} - return self.packer_chassis.make_can_msg_panda("EBCMFrictionBrakeCmd", self.BRAKE_BUS, values) - - def _send_gas_msg(self, gas): - values = {"GasRegenCmd": gas} - return self.packer.make_can_msg_panda("ASCMGasRegenCmd", 0, values) - - # override these tests from PandaCarSafetyTest, GM longitudinal uses button enable - def _pcm_status_msg(self, enable): - raise NotImplementedError - - def test_disable_control_allowed_from_cruise(self): - pass - - def test_enable_control_allowed_from_cruise(self): - pass - - def test_cruise_engaged_prev(self): - pass - - def test_set_resume_buttons(self): - """ - SET and RESUME enter controls allowed on their falling and rising edges, respectively. - """ - for btn_prev in range(8): - for btn_cur in range(8): - with self.subTest(btn_prev=btn_prev, btn_cur=btn_cur): - self._rx(self._button_msg(btn_prev)) - self.safety.set_controls_allowed(0) - for _ in range(10): - self._rx(self._button_msg(btn_cur)) - - should_enable = btn_cur != Buttons.DECEL_SET and btn_prev == Buttons.DECEL_SET - should_enable = should_enable or (btn_cur == Buttons.RES_ACCEL and btn_prev != Buttons.RES_ACCEL) - should_enable = should_enable and btn_cur != Buttons.CANCEL - self.assertEqual(should_enable, self.safety.get_controls_allowed()) - - def test_cancel_button(self): - self.safety.set_controls_allowed(1) - self._rx(self._button_msg(Buttons.CANCEL)) - self.assertFalse(self.safety.get_controls_allowed()) - - -class TestGmSafetyBase(common.PandaCarSafetyTest, common.DriverTorqueSteeringSafetyTest): - STANDSTILL_THRESHOLD = 10 * 0.0311 - # Ensures ASCM is off on ASCM cars, and relay is not malfunctioning for camera-ACC cars - RELAY_MALFUNCTION_ADDRS = {0: (0x180,)} # ASCMLKASteeringCmd - BUTTONS_BUS = 0 # rx or tx - BRAKE_BUS = 0 # tx only - - MAX_RATE_UP = 10 - MAX_RATE_DOWN = 15 - MAX_TORQUE = 300 - MAX_RT_DELTA = 128 - RT_INTERVAL = 250000 - DRIVER_TORQUE_ALLOWANCE = 65 - DRIVER_TORQUE_FACTOR = 4 - - PCM_CRUISE = True # openpilot is tied to the PCM state if not longitudinal - - @classmethod - def setUpClass(cls): - if cls.__name__ == "TestGmSafetyBase": - cls.packer = None - cls.safety = None - raise unittest.SkipTest - - def setUp(self): - self.packer = CANPackerPanda("gm_global_a_powertrain_generated") - self.packer_chassis = CANPackerPanda("gm_global_a_chassis") - self.safety = libsafety_py.libsafety - self.safety.set_safety_hooks(CarParams.SafetyModel.gm, 0) - self.safety.init_tests() - - def _pcm_status_msg(self, enable): - if self.PCM_CRUISE: - values = {"CruiseState": enable} - return self.packer.make_can_msg_panda("AcceleratorPedal2", 0, values) - else: - raise NotImplementedError - - def _speed_msg(self, speed): - values = {"%sWheelSpd" % s: speed for s in ["RL", "RR"]} - return self.packer.make_can_msg_panda("EBCMWheelSpdRear", 0, values) - - def _user_brake_msg(self, brake): - # GM safety has a brake threshold of 8 - values = {"BrakePedalPos": 8 if brake else 0} - return self.packer.make_can_msg_panda("ECMAcceleratorPos", 0, values) - - def _user_regen_msg(self, regen): - values = {"RegenPaddle": 2 if regen else 0} - return self.packer.make_can_msg_panda("EBCMRegenPaddle", 0, values) - - def _user_gas_msg(self, gas): - values = {"AcceleratorPedal2": 1 if gas else 0} - if self.PCM_CRUISE: - # Fill CruiseState with expected value if the safety mode reads cruise state from gas msg - values["CruiseState"] = self.safety.get_controls_allowed() - return self.packer.make_can_msg_panda("AcceleratorPedal2", 0, values) - - def _torque_driver_msg(self, torque): - # Safety tests assume driver torque is an int, use DBC factor - values = {"LKADriverAppldTrq": torque * 0.01} - return self.packer.make_can_msg_panda("PSCMStatus", 0, values) - - def _torque_cmd_msg(self, torque, steer_req=1): - values = {"LKASteeringCmd": torque, "LKASteeringCmdActive": steer_req} - return self.packer.make_can_msg_panda("ASCMLKASteeringCmd", 0, values) - - def _button_msg(self, buttons): - values = {"ACCButtons": buttons} - return self.packer.make_can_msg_panda("ASCMSteeringButton", self.BUTTONS_BUS, values) - - -class TestGmAscmSafety(GmLongitudinalBase, TestGmSafetyBase): - TX_MSGS = [[0x180, 0], [0x409, 0], [0x40A, 0], [0x2CB, 0], [0x370, 0], # pt bus - [0xA1, 1], [0x306, 1], [0x308, 1], [0x310, 1], # obs bus - [0x315, 2]] # ch bus - FWD_BLACKLISTED_ADDRS: dict[int, list[int]] = {} - FWD_BUS_LOOKUP: dict[int, int] = {} - BRAKE_BUS = 2 - - MAX_GAS = 3072 - MIN_GAS = 1404 # maximum regen - INACTIVE_GAS = 1404 - - def setUp(self): - self.packer = CANPackerPanda("gm_global_a_powertrain_generated") - self.packer_chassis = CANPackerPanda("gm_global_a_chassis") - self.safety = libsafety_py.libsafety - self.safety.set_safety_hooks(CarParams.SafetyModel.gm, 0) - self.safety.init_tests() - - -class TestGmCameraSafetyBase(TestGmSafetyBase): - - - @classmethod - def setUpClass(cls): - if cls.__name__ == "TestGmCameraSafetyBase": - cls.packer = None - cls.safety = None - raise unittest.SkipTest - - def _user_brake_msg(self, brake): - values = {"BrakePressed": brake} - return self.packer.make_can_msg_panda("ECMEngineStatus", 0, values) - - -class TestGmCameraSafety(TestGmCameraSafetyBase): - TX_MSGS = [[0x180, 0], # pt bus - [0x184, 2]] # camera bus - FWD_BLACKLISTED_ADDRS = {2: [0x180], 0: [0x184]} # block LKAS message and PSCMStatus - BUTTONS_BUS = 2 # tx only - - def setUp(self): - self.packer = CANPackerPanda("gm_global_a_powertrain_generated") - self.packer_chassis = CANPackerPanda("gm_global_a_chassis") - self.safety = libsafety_py.libsafety - self.safety.set_safety_hooks(CarParams.SafetyModel.gm, GMSafetyFlags.HW_CAM) - self.safety.init_tests() - - def test_buttons(self): - # Only CANCEL button is allowed while cruise is enabled - self.safety.set_controls_allowed(0) - for btn in range(8): - self.assertFalse(self._tx(self._button_msg(btn))) - - self.safety.set_controls_allowed(1) - for btn in range(8): - self.assertFalse(self._tx(self._button_msg(btn))) - - for enabled in (True, False): - self._rx(self._pcm_status_msg(enabled)) - self.assertEqual(enabled, self._tx(self._button_msg(Buttons.CANCEL))) - - -class TestGmCameraLongitudinalSafety(GmLongitudinalBase, TestGmCameraSafetyBase): - TX_MSGS = [[0x180, 0], [0x315, 0], [0x2CB, 0], [0x370, 0], # pt bus - [0x184, 2]] # camera bus - FWD_BLACKLISTED_ADDRS = {2: [0x180, 0x2CB, 0x370, 0x315], 0: [0x184]} # block LKAS, ACC messages and PSCMStatus - BUTTONS_BUS = 0 # rx only - - MAX_GAS = 3400 - MIN_GAS = 1514 # maximum regen - INACTIVE_GAS = 1554 - - def setUp(self): - self.packer = CANPackerPanda("gm_global_a_powertrain_generated") - self.packer_chassis = CANPackerPanda("gm_global_a_chassis") - self.safety = libsafety_py.libsafety - self.safety.set_safety_hooks(CarParams.SafetyModel.gm, GMSafetyFlags.HW_CAM | GMSafetyFlags.HW_CAM_LONG) - self.safety.init_tests() - - -if __name__ == "__main__": - unittest.main() diff --git a/opendbc/safety/tests/test_honda.py b/opendbc/safety/tests/test_honda.py deleted file mode 100755 index 7585ce2e2ae..00000000000 --- a/opendbc/safety/tests/test_honda.py +++ /dev/null @@ -1,573 +0,0 @@ -#!/usr/bin/env python3 -import unittest -import numpy as np - -from opendbc.car.honda.values import HondaSafetyFlags -from opendbc.safety.tests.libsafety import libsafety_py -import opendbc.safety.tests.common as common -from opendbc.car.structs import CarParams -from opendbc.safety.tests.common import CANPackerPanda, MAX_WRONG_COUNTERS - -HONDA_N_COMMON_TX_MSGS = [[0xE4, 0], [0x194, 0], [0x1FA, 0], [0x30C, 0], [0x33D, 0]] - -class Btn: - NONE = 0 - MAIN = 1 - CANCEL = 2 - SET = 3 - RESUME = 4 - -HONDA_NIDEC = 0 -HONDA_BOSCH = 1 - - -# Honda safety has several different configurations tested here: -# * Nidec -# * normal (PCM-enable) -# * alt SCM messages (PCM-enable) -# * Bosch -# * Bosch with Longitudinal Support -# * Bosch Radarless -# * Bosch Radarless with Longitudinal Support - - -class HondaButtonEnableBase(common.PandaCarSafetyTest): - # pylint: disable=no-member,abstract-method - - # override these inherited tests since we're using button enable - def test_disable_control_allowed_from_cruise(self): - pass - - def test_enable_control_allowed_from_cruise(self): - pass - - def test_cruise_engaged_prev(self): - pass - - def test_buttons_with_main_off(self): - for btn in (Btn.SET, Btn.RESUME, Btn.CANCEL): - self.safety.set_controls_allowed(1) - self._rx(self._acc_state_msg(False)) - self._rx(self._button_msg(btn, main_on=False)) - self.assertFalse(self.safety.get_controls_allowed()) - - def test_set_resume_buttons(self): - """ - Both SET and RES should enter controls allowed on their falling edge. - """ - for main_on in (True, False): - self._rx(self._acc_state_msg(main_on)) - for btn_prev in range(8): - for btn_cur in range(8): - self._rx(self._button_msg(Btn.NONE)) - self.safety.set_controls_allowed(0) - for _ in range(10): - self._rx(self._button_msg(btn_prev)) - self.assertFalse(self.safety.get_controls_allowed()) - - # should enter controls allowed on falling edge and not transitioning to cancel or main - should_enable = (main_on and - btn_cur != btn_prev and - btn_prev in (Btn.RESUME, Btn.SET) and - btn_cur not in (Btn.CANCEL, Btn.MAIN)) - - self._rx(self._button_msg(btn_cur, main_on=main_on)) - self.assertEqual(should_enable, self.safety.get_controls_allowed(), msg=f"{main_on=} {btn_prev=} {btn_cur=}") - - def test_main_cancel_buttons(self): - """ - Both MAIN and CANCEL should exit controls immediately. - """ - for btn in (Btn.MAIN, Btn.CANCEL): - self.safety.set_controls_allowed(1) - self._rx(self._button_msg(btn, main_on=True)) - self.assertFalse(self.safety.get_controls_allowed()) - - def test_disengage_on_main(self): - self.safety.set_controls_allowed(1) - self._rx(self._acc_state_msg(True)) - self.assertTrue(self.safety.get_controls_allowed()) - self._rx(self._acc_state_msg(False)) - self.assertFalse(self.safety.get_controls_allowed()) - - def test_rx_hook(self): - - # TODO: move this test to common - # checksum checks - for msg in ["btn", "gas", "speed"]: - self.safety.set_controls_allowed(1) - if msg == "btn": - to_push = self._button_msg(Btn.SET) - if msg == "gas": - to_push = self._user_gas_msg(0) - if msg == "speed": - to_push = self._speed_msg(0) - self.assertTrue(self._rx(to_push)) - if msg != "btn": - to_push[0].data[4] = 0 # invalidate checksum - to_push[0].data[5] = 0 - to_push[0].data[6] = 0 - to_push[0].data[7] = 0 - self.assertFalse(self._rx(to_push)) - self.assertFalse(self.safety.get_controls_allowed()) - - # counter - # reset wrong_counters to zero by sending valid messages - for i in range(MAX_WRONG_COUNTERS + 1): - self.__class__.cnt_speed += 1 - self.__class__.cnt_button += 1 - self.__class__.cnt_powertrain_data += 1 - if i < MAX_WRONG_COUNTERS: - self.safety.set_controls_allowed(1) - self._rx(self._button_msg(Btn.SET)) - self._rx(self._speed_msg(0)) - self._rx(self._user_gas_msg(0)) - else: - self.assertFalse(self._rx(self._button_msg(Btn.SET))) - self.assertFalse(self._rx(self._speed_msg(0))) - self.assertFalse(self._rx(self._user_gas_msg(0))) - self.assertFalse(self.safety.get_controls_allowed()) - - # restore counters for future tests with a couple of good messages - for _ in range(2): - self.safety.set_controls_allowed(1) - self._rx(self._button_msg(Btn.SET, main_on=True)) - self._rx(self._speed_msg(0)) - self._rx(self._user_gas_msg(0)) - self._rx(self._button_msg(Btn.SET, main_on=True)) - self.assertTrue(self.safety.get_controls_allowed()) - - -class HondaPcmEnableBase(common.PandaCarSafetyTest): - # pylint: disable=no-member,abstract-method - - def test_buttons(self): - """ - Buttons should only cancel in this configuration, - since our state is tied to the PCM's cruise state. - """ - for controls_allowed in (True, False): - for main_on in (True, False): - # not a valid state - if controls_allowed and not main_on: - continue - - for btn in (Btn.SET, Btn.RESUME, Btn.CANCEL): - self.safety.set_controls_allowed(controls_allowed) - self._rx(self._acc_state_msg(main_on)) - - # btn + none for falling edge - self._rx(self._button_msg(btn, main_on=main_on)) - self._rx(self._button_msg(Btn.NONE, main_on=main_on)) - - if btn == Btn.CANCEL: - self.assertFalse(self.safety.get_controls_allowed()) - else: - self.assertEqual(controls_allowed, self.safety.get_controls_allowed()) - - -class HondaBase(common.PandaCarSafetyTest): - MAX_BRAKE = 255 - PT_BUS: int | None = None # must be set when inherited - STEER_BUS: int | None = None # must be set when inherited - BUTTONS_BUS: int | None = None # must be set when inherited, tx on this bus, rx on PT_BUS - - RELAY_MALFUNCTION_ADDRS = {0: (0xE4, 0x194)} # STEERING_CONTROL - - cnt_speed = 0 - cnt_button = 0 - cnt_brake = 0 - cnt_powertrain_data = 0 - cnt_acc_state = 0 - - @classmethod - def setUpClass(cls): - if cls.__name__.endswith("Base"): - cls.packer = None - cls.safety = None - raise unittest.SkipTest - - def _powertrain_data_msg(self, cruise_on=None, brake_pressed=None, gas_pressed=None): - # preserve the state - if cruise_on is None: - # or'd with controls allowed since the tests use it to "enable" cruise - cruise_on = self.safety.get_cruise_engaged_prev() or self.safety.get_controls_allowed() - if brake_pressed is None: - brake_pressed = self.safety.get_brake_pressed_prev() - if gas_pressed is None: - gas_pressed = self.safety.get_gas_pressed_prev() - - values = { - "ACC_STATUS": cruise_on, - "BRAKE_PRESSED": brake_pressed, - "PEDAL_GAS": gas_pressed, - "COUNTER": self.cnt_powertrain_data % 4 - } - self.__class__.cnt_powertrain_data += 1 - return self.packer.make_can_msg_panda("POWERTRAIN_DATA", self.PT_BUS, values) - - def _pcm_status_msg(self, enable): - return self._powertrain_data_msg(cruise_on=enable) - - def _speed_msg(self, speed): - values = {"XMISSION_SPEED": speed, "COUNTER": self.cnt_speed % 4} - self.__class__.cnt_speed += 1 - return self.packer.make_can_msg_panda("ENGINE_DATA", self.PT_BUS, values) - - def _acc_state_msg(self, main_on): - values = {"MAIN_ON": main_on, "COUNTER": self.cnt_acc_state % 4} - self.__class__.cnt_acc_state += 1 - return self.packer.make_can_msg_panda("SCM_FEEDBACK", self.PT_BUS, values) - - def _button_msg(self, buttons, main_on=False, bus=None): - bus = self.PT_BUS if bus is None else bus - values = {"CRUISE_BUTTONS": buttons, "COUNTER": self.cnt_button % 4} - self.__class__.cnt_button += 1 - return self.packer.make_can_msg_panda("SCM_BUTTONS", bus, values) - - def _user_brake_msg(self, brake): - return self._powertrain_data_msg(brake_pressed=brake) - - def _user_gas_msg(self, gas): - return self._powertrain_data_msg(gas_pressed=gas) - - def _send_steer_msg(self, steer): - values = {"STEER_TORQUE": steer} - return self.packer.make_can_msg_panda("STEERING_CONTROL", self.STEER_BUS, values) - - def _send_brake_msg(self, brake): - # must be implemented when inherited - raise NotImplementedError - - def test_disengage_on_brake(self): - self.safety.set_controls_allowed(1) - self._rx(self._user_brake_msg(1)) - self.assertFalse(self.safety.get_controls_allowed()) - - def test_steer_safety_check(self): - self.safety.set_controls_allowed(0) - self.assertTrue(self._tx(self._send_steer_msg(0x0000))) - self.assertFalse(self._tx(self._send_steer_msg(0x1000))) - - -# ********************* Honda Nidec ********************** - - -class TestHondaNidecSafetyBase(HondaBase): - TX_MSGS = HONDA_N_COMMON_TX_MSGS - FWD_BLACKLISTED_ADDRS = {2: [0xE4, 0x194, 0x33D, 0x30C]} - - PT_BUS = 0 - STEER_BUS = 0 - BUTTONS_BUS = 0 - - MAX_GAS = 198 - - def setUp(self): - self.packer = CANPackerPanda("honda_civic_touring_2016_can_generated") - self.safety = libsafety_py.libsafety - self.safety.set_safety_hooks(CarParams.SafetyModel.hondaNidec, 0) - self.safety.init_tests() - - def _send_brake_msg(self, brake, aeb_req=0, bus=0): - values = {"COMPUTER_BRAKE": brake, "AEB_REQ_1": aeb_req} - return self.packer.make_can_msg_panda("BRAKE_COMMAND", bus, values) - - def _rx_brake_msg(self, brake, aeb_req=0): - return self._send_brake_msg(brake, aeb_req, bus=2) - - def _send_acc_hud_msg(self, pcm_gas, pcm_speed): - # Used to control ACC on Nidec without pedal - values = {"PCM_GAS": pcm_gas, "PCM_SPEED": pcm_speed} - return self.packer.make_can_msg_panda("ACC_HUD", 0, values) - - def test_acc_hud_safety_check(self): - for controls_allowed in [True, False]: - self.safety.set_controls_allowed(controls_allowed) - for pcm_gas in range(255): - for pcm_speed in range(100): - send = (controls_allowed and pcm_gas <= self.MAX_GAS) or (pcm_gas == 0 and pcm_speed == 0) - self.assertEqual(send, self._tx(self._send_acc_hud_msg(pcm_gas, pcm_speed))) - - def test_fwd_hook(self): - # normal operation, not forwarding AEB - self.FWD_BLACKLISTED_ADDRS[2].append(0x1FA) - self.safety.set_honda_fwd_brake(False) - super().test_fwd_hook() - - # forwarding AEB brake signal - self.FWD_BLACKLISTED_ADDRS = {2: [0xE4, 0x194, 0x33D, 0x30C]} - self.safety.set_honda_fwd_brake(True) - super().test_fwd_hook() - - def test_honda_fwd_brake_latching(self): - # Shouldn't fwd stock Honda requesting brake without AEB - self.assertTrue(self._rx(self._rx_brake_msg(self.MAX_BRAKE, aeb_req=0))) - self.assertFalse(self.safety.get_honda_fwd_brake()) - - # Now allow controls and request some brake - openpilot_brake = round(self.MAX_BRAKE / 2.0) - self.safety.set_controls_allowed(True) - self.assertTrue(self._tx(self._send_brake_msg(openpilot_brake))) - - # Still shouldn't fwd stock Honda brake until it's more than openpilot's - for stock_honda_brake in range(self.MAX_BRAKE + 1): - self.assertTrue(self._rx(self._rx_brake_msg(stock_honda_brake, aeb_req=1))) - should_fwd_brake = stock_honda_brake >= openpilot_brake - self.assertEqual(should_fwd_brake, self.safety.get_honda_fwd_brake()) - - # Shouldn't stop fwding until AEB event is over - for stock_honda_brake in range(self.MAX_BRAKE + 1)[::-1]: - self.assertTrue(self._rx(self._rx_brake_msg(stock_honda_brake, aeb_req=1))) - self.assertTrue(self.safety.get_honda_fwd_brake()) - - self.assertTrue(self._rx(self._rx_brake_msg(0, aeb_req=0))) - self.assertFalse(self.safety.get_honda_fwd_brake()) - - def test_brake_safety_check(self): - for fwd_brake in [False, True]: - self.safety.set_honda_fwd_brake(fwd_brake) - for brake in np.arange(0, self.MAX_BRAKE + 10, 1): - for controls_allowed in [True, False]: - self.safety.set_controls_allowed(controls_allowed) - if fwd_brake: - send = False # block openpilot brake msg when fwd'ing stock msg - elif controls_allowed: - send = self.MAX_BRAKE >= brake >= 0 - else: - send = brake == 0 - self.assertEqual(send, self._tx(self._send_brake_msg(brake))) - - -class TestHondaNidecPcmSafety(HondaPcmEnableBase, TestHondaNidecSafetyBase): - """ - Covers the Honda Nidec safety mode - """ - - # Nidec doesn't disengage on falling edge of cruise. See comment in safety_honda.h - def test_disable_control_allowed_from_cruise(self): - pass - - -class TestHondaNidecPcmAltSafety(TestHondaNidecPcmSafety): - """ - Covers the Honda Nidec safety mode with alt SCM messages - """ - def setUp(self): - self.packer = CANPackerPanda("acura_ilx_2016_can_generated") - self.safety = libsafety_py.libsafety - self.safety.set_safety_hooks(CarParams.SafetyModel.hondaNidec, HondaSafetyFlags.NIDEC_ALT) - self.safety.init_tests() - - def _acc_state_msg(self, main_on): - values = {"MAIN_ON": main_on, "COUNTER": self.cnt_acc_state % 4} - self.__class__.cnt_acc_state += 1 - return self.packer.make_can_msg_panda("SCM_BUTTONS", self.PT_BUS, values) - - def _button_msg(self, buttons, main_on=False, bus=None): - bus = self.PT_BUS if bus is None else bus - values = {"CRUISE_BUTTONS": buttons, "MAIN_ON": main_on, "COUNTER": self.cnt_button % 4} - self.__class__.cnt_button += 1 - return self.packer.make_can_msg_panda("SCM_BUTTONS", bus, values) - - -# ********************* Honda Bosch ********************** - - -class TestHondaBoschSafetyBase(HondaBase): - PT_BUS = 1 - STEER_BUS = 0 - BUTTONS_BUS = 1 - - TX_MSGS = [[0xE4, 0], [0xE5, 0], [0x296, 1], [0x33D, 0], [0x33DA, 0], [0x33DB, 0]] - FWD_BLACKLISTED_ADDRS = {2: [0xE4, 0xE5, 0x33D, 0x33DA, 0x33DB]} - - def setUp(self): - self.packer = CANPackerPanda("honda_accord_2018_can_generated") - self.safety = libsafety_py.libsafety - - def _alt_brake_msg(self, brake): - values = {"BRAKE_PRESSED": brake, "COUNTER": self.cnt_brake % 4} - self.__class__.cnt_brake += 1 - return self.packer.make_can_msg_panda("BRAKE_MODULE", self.PT_BUS, values) - - def _send_brake_msg(self, brake): - pass - - def test_alt_disengage_on_brake(self): - self.safety.set_honda_alt_brake_msg(1) - self.safety.set_controls_allowed(1) - self._rx(self._alt_brake_msg(1)) - self.assertFalse(self.safety.get_controls_allowed()) - - self.safety.set_honda_alt_brake_msg(0) - self.safety.set_controls_allowed(1) - self._rx(self._alt_brake_msg(1)) - self.assertTrue(self.safety.get_controls_allowed()) - - def test_spam_cancel_safety_check(self): - self.safety.set_controls_allowed(0) - self.assertTrue(self._tx(self._button_msg(Btn.CANCEL, bus=self.BUTTONS_BUS))) - self.assertFalse(self._tx(self._button_msg(Btn.RESUME, bus=self.BUTTONS_BUS))) - self.assertFalse(self._tx(self._button_msg(Btn.SET, bus=self.BUTTONS_BUS))) - # do not block resume if we are engaged already - self.safety.set_controls_allowed(1) - self.assertTrue(self._tx(self._button_msg(Btn.RESUME, bus=self.BUTTONS_BUS))) - - -class TestHondaBoschAltBrakeSafetyBase(TestHondaBoschSafetyBase): - """ - Base Bosch safety test class with an alternate brake message - """ - def setUp(self): - super().setUp() - self.safety.set_safety_hooks(CarParams.SafetyModel.hondaBosch, HondaSafetyFlags.ALT_BRAKE) - self.safety.init_tests() - - def _user_brake_msg(self, brake): - return self._alt_brake_msg(brake) - - def test_alt_brake_rx_hook(self): - self.safety.set_honda_alt_brake_msg(1) - self.safety.set_controls_allowed(1) - to_push = self._alt_brake_msg(0) - self.assertTrue(self._rx(to_push)) - to_push[0].data[2] = to_push[0].data[2] & 0xF0 # invalidate checksum - self.assertFalse(self._rx(to_push)) - self.assertFalse(self.safety.get_controls_allowed()) - - -class TestHondaBoschSafety(HondaPcmEnableBase, TestHondaBoschSafetyBase): - """ - Covers the Honda Bosch safety mode with stock longitudinal - """ - def setUp(self): - super().setUp() - self.safety.set_safety_hooks(CarParams.SafetyModel.hondaBosch, 0) - self.safety.init_tests() - - -class TestHondaBoschAltBrakeSafety(HondaPcmEnableBase, TestHondaBoschAltBrakeSafetyBase): - """ - Covers the Honda Bosch safety mode with stock longitudinal and an alternate brake message - """ - - -class TestHondaBoschLongSafety(HondaButtonEnableBase, TestHondaBoschSafetyBase): - """ - Covers the Honda Bosch safety mode with longitudinal control - """ - NO_GAS = -30000 - MAX_GAS = 2000 - MAX_ACCEL = 2.0 # accel is used for brakes, but openpilot can set positive values - MIN_ACCEL = -3.5 - - STEER_BUS = 1 - TX_MSGS = [[0xE4, 1], [0x1DF, 1], [0x1EF, 1], [0x1FA, 1], [0x30C, 1], [0x33D, 1], [0x33DA, 1], [0x33DB, 1], [0x39F, 1], [0x18DAB0F1, 1]] - FWD_BLACKLISTED_ADDRS = {2: [0xE4, 0xE5, 0x33D, 0x33DA, 0x33DB]} - # 0x1DF is to test that radar is disabled - RELAY_MALFUNCTION_ADDRS = {0: (0xE4, 0x194), 1: (0x1DF,)} # STEERING_CONTROL, ACC_CONTROL - - def setUp(self): - super().setUp() - self.safety.set_safety_hooks(CarParams.SafetyModel.hondaBosch, HondaSafetyFlags.BOSCH_LONG) - self.safety.init_tests() - - def _send_gas_brake_msg(self, gas, accel): - values = { - "GAS_COMMAND": gas, - "ACCEL_COMMAND": accel, - "BRAKE_REQUEST": accel < 0, - } - return self.packer.make_can_msg_panda("ACC_CONTROL", self.PT_BUS, values) - - # Longitudinal doesn't need to send buttons - def test_spam_cancel_safety_check(self): - pass - - def test_diagnostics(self): - tester_present = libsafety_py.make_CANPacket(0x18DAB0F1, self.PT_BUS, b"\x02\x3E\x80\x00\x00\x00\x00\x00") - self.assertTrue(self._tx(tester_present)) - - not_tester_present = libsafety_py.make_CANPacket(0x18DAB0F1, self.PT_BUS, b"\x03\xAA\xAA\x00\x00\x00\x00\x00") - self.assertFalse(self._tx(not_tester_present)) - - def test_gas_safety_check(self): - for controls_allowed in [True, False]: - for gas in np.arange(self.NO_GAS, self.MAX_GAS + 2000, 100): - accel = 0 if gas < 0 else gas / 1000 - self.safety.set_controls_allowed(controls_allowed) - send = (controls_allowed and 0 <= gas <= self.MAX_GAS) or gas == self.NO_GAS - self.assertEqual(send, self._tx(self._send_gas_brake_msg(gas, accel)), (controls_allowed, gas, accel)) - - def test_brake_safety_check(self): - for controls_allowed in [True, False]: - for accel in np.arange(self.MIN_ACCEL - 1, self.MAX_ACCEL + 1, 0.01): - accel = round(accel, 2) # floats might not hit exact boundary conditions without rounding - self.safety.set_controls_allowed(controls_allowed) - send = self.MIN_ACCEL <= accel <= self.MAX_ACCEL if controls_allowed else accel == 0 - self.assertEqual(send, self._tx(self._send_gas_brake_msg(self.NO_GAS, accel)), (controls_allowed, accel)) - - -class TestHondaBoschRadarlessSafetyBase(TestHondaBoschSafetyBase): - """Base class for radarless Honda Bosch""" - PT_BUS = 0 - STEER_BUS = 0 - BUTTONS_BUS = 2 # camera controls ACC, need to send buttons on bus 2 - - TX_MSGS = [[0xE4, 0], [0x296, 2], [0x33D, 0]] - FWD_BLACKLISTED_ADDRS = {2: [0xE4, 0xE5, 0x33D, 0x33DA, 0x33DB]} - - def setUp(self): - self.packer = CANPackerPanda("honda_civic_ex_2022_can_generated") - self.safety = libsafety_py.libsafety - - -class TestHondaBoschRadarlessSafety(HondaPcmEnableBase, TestHondaBoschRadarlessSafetyBase): - """ - Covers the Honda Bosch Radarless safety mode with stock longitudinal - """ - - def setUp(self): - super().setUp() - self.safety.set_safety_hooks(CarParams.SafetyModel.hondaBosch, HondaSafetyFlags.RADARLESS) - self.safety.init_tests() - - -class TestHondaBoschRadarlessAltBrakeSafety(HondaPcmEnableBase, TestHondaBoschRadarlessSafetyBase, TestHondaBoschAltBrakeSafetyBase): - """ - Covers the Honda Bosch Radarless safety mode with stock longitudinal and an alternate brake message - """ - - def setUp(self): - super().setUp() - self.safety.set_safety_hooks(CarParams.SafetyModel.hondaBosch, HondaSafetyFlags.RADARLESS | HondaSafetyFlags.ALT_BRAKE) - self.safety.init_tests() - - -class TestHondaBoschRadarlessLongSafety(common.LongitudinalAccelSafetyTest, HondaButtonEnableBase, - TestHondaBoschRadarlessSafetyBase): - """ - Covers the Honda Bosch Radarless safety mode with longitudinal control - """ - TX_MSGS = [[0xE4, 0], [0x33D, 0], [0x1C8, 0], [0x30C, 0]] - FWD_BLACKLISTED_ADDRS = {2: [0xE4, 0xE5, 0x33D, 0x33DA, 0x33DB, 0x1C8, 0x30C]} - - def setUp(self): - super().setUp() - self.safety.set_safety_hooks(CarParams.SafetyModel.hondaBosch, HondaSafetyFlags.RADARLESS | HondaSafetyFlags.BOSCH_LONG) - self.safety.init_tests() - - def _accel_msg(self, accel): - values = { - "ACCEL_COMMAND": accel, - } - return self.packer.make_can_msg_panda("ACC_CONTROL", self.PT_BUS, values) - - # Longitudinal doesn't need to send buttons - def test_spam_cancel_safety_check(self): - pass - - -if __name__ == "__main__": - unittest.main() diff --git a/opendbc/safety/tests/test_hyundai.py b/opendbc/safety/tests/test_hyundai.py deleted file mode 100755 index e35962108a5..00000000000 --- a/opendbc/safety/tests/test_hyundai.py +++ /dev/null @@ -1,273 +0,0 @@ -#!/usr/bin/env python3 -import random -import unittest - -from opendbc.car.hyundai.values import HyundaiSafetyFlags -from opendbc.car.structs import CarParams -from opendbc.safety.tests.libsafety import libsafety_py -import opendbc.safety.tests.common as common -from opendbc.safety.tests.common import CANPackerPanda -from opendbc.safety.tests.hyundai_common import HyundaiButtonBase, HyundaiLongitudinalBase - - -# 4 bit checkusm used in some hyundai messages -# lives outside the can packer because we never send this msg -def checksum(msg): - addr, dat, bus = msg - - chksum = 0 - if addr == 0x386: - for i, b in enumerate(dat): - for j in range(8): - # exclude checksum and counter bits - if (i != 1 or j < 6) and (i != 3 or j < 6) and (i != 5 or j < 6) and (i != 7 or j < 6): - bit = (b >> j) & 1 - else: - bit = 0 - chksum += bit - chksum = (chksum ^ 9) & 0xF - ret = bytearray(dat) - ret[5] |= (chksum & 0x3) << 6 - ret[7] |= (chksum & 0xc) << 4 - else: - for i, b in enumerate(dat): - if addr in [0x260, 0x421] and i == 7: - b &= 0x0F if addr == 0x421 else 0xF0 - elif addr == 0x394 and i == 6: - b &= 0xF0 - elif addr == 0x394 and i == 7: - continue - chksum += sum(divmod(b, 16)) - chksum = (16 - chksum) % 16 - ret = bytearray(dat) - ret[6 if addr == 0x394 else 7] |= chksum << (4 if addr == 0x421 else 0) - - return addr, ret, bus - - -class TestHyundaiSafety(HyundaiButtonBase, common.PandaCarSafetyTest, common.DriverTorqueSteeringSafetyTest, common.SteerRequestCutSafetyTest): - TX_MSGS = [[0x340, 0], [0x4F1, 0], [0x485, 0]] - STANDSTILL_THRESHOLD = 12 # 0.375 kph - RELAY_MALFUNCTION_ADDRS = {0: (0x340,)} # LKAS11 - FWD_BLACKLISTED_ADDRS = {2: [0x340, 0x485]} - - MAX_RATE_UP = 3 - MAX_RATE_DOWN = 7 - MAX_TORQUE = 384 - MAX_RT_DELTA = 112 - RT_INTERVAL = 250000 - DRIVER_TORQUE_ALLOWANCE = 50 - DRIVER_TORQUE_FACTOR = 2 - - # Safety around steering req bit - MIN_VALID_STEERING_FRAMES = 89 - MAX_INVALID_STEERING_FRAMES = 2 - MIN_VALID_STEERING_RT_INTERVAL = 810000 # a ~10% buffer, can send steer up to 110Hz - - cnt_gas = 0 - cnt_speed = 0 - cnt_brake = 0 - cnt_cruise = 0 - cnt_button = 0 - - def setUp(self): - self.packer = CANPackerPanda("hyundai_kia_generic") - self.safety = libsafety_py.libsafety - self.safety.set_safety_hooks(CarParams.SafetyModel.hyundai, 0) - self.safety.init_tests() - - def _button_msg(self, buttons, main_button=0, bus=0): - values = {"CF_Clu_CruiseSwState": buttons, "CF_Clu_CruiseSwMain": main_button, "CF_Clu_AliveCnt1": self.cnt_button} - self.__class__.cnt_button += 1 - return self.packer.make_can_msg_panda("CLU11", bus, values) - - def _user_gas_msg(self, gas): - values = {"CF_Ems_AclAct": gas, "AliveCounter": self.cnt_gas % 4} - self.__class__.cnt_gas += 1 - return self.packer.make_can_msg_panda("EMS16", 0, values, fix_checksum=checksum) - - def _user_brake_msg(self, brake): - values = {"DriverOverride": 2 if brake else random.choice((0, 1, 3)), - "AliveCounterTCS": self.cnt_brake % 8} - self.__class__.cnt_brake += 1 - return self.packer.make_can_msg_panda("TCS13", 0, values, fix_checksum=checksum) - - def _speed_msg(self, speed): - # panda safety doesn't scale, so undo the scaling - values = {"WHL_SPD_%s" % s: speed * 0.03125 for s in ["FL", "FR", "RL", "RR"]} - values["WHL_SPD_AliveCounter_LSB"] = (self.cnt_speed % 16) & 0x3 - values["WHL_SPD_AliveCounter_MSB"] = (self.cnt_speed % 16) >> 2 - self.__class__.cnt_speed += 1 - return self.packer.make_can_msg_panda("WHL_SPD11", 0, values, fix_checksum=checksum) - - def _pcm_status_msg(self, enable): - values = {"ACCMode": enable, "CR_VSM_Alive": self.cnt_cruise % 16} - self.__class__.cnt_cruise += 1 - return self.packer.make_can_msg_panda("SCC12", self.SCC_BUS, values, fix_checksum=checksum) - - def _torque_driver_msg(self, torque): - values = {"CR_Mdps_StrColTq": torque} - return self.packer.make_can_msg_panda("MDPS12", 0, values) - - def _torque_cmd_msg(self, torque, steer_req=1): - values = {"CR_Lkas_StrToqReq": torque, "CF_Lkas_ActToi": steer_req} - return self.packer.make_can_msg_panda("LKAS11", 0, values) - - -class TestHyundaiSafetyAltLimits(TestHyundaiSafety): - MAX_RATE_UP = 2 - MAX_RATE_DOWN = 3 - MAX_TORQUE = 270 - - def setUp(self): - self.packer = CANPackerPanda("hyundai_kia_generic") - self.safety = libsafety_py.libsafety - self.safety.set_safety_hooks(CarParams.SafetyModel.hyundai, HyundaiSafetyFlags.ALT_LIMITS) - self.safety.init_tests() - - -class TestHyundaiSafetyAltLimits2(TestHyundaiSafety): - MAX_RATE_UP = 2 - MAX_RATE_DOWN = 3 - MAX_TORQUE = 170 - - def setUp(self): - self.packer = CANPackerPanda("hyundai_kia_generic") - self.safety = libsafety_py.libsafety - self.safety.set_safety_hooks(CarParams.SafetyModel.hyundai, HyundaiSafetyFlags.ALT_LIMITS_2) - self.safety.init_tests() - - -class TestHyundaiSafetyCameraSCC(TestHyundaiSafety): - BUTTONS_TX_BUS = 2 # tx on 2, rx on 0 - SCC_BUS = 2 # rx on 2 - - def setUp(self): - self.packer = CANPackerPanda("hyundai_kia_generic") - self.safety = libsafety_py.libsafety - self.safety.set_safety_hooks(CarParams.SafetyModel.hyundai, HyundaiSafetyFlags.CAMERA_SCC) - self.safety.init_tests() - - -class TestHyundaiSafetyFCEV(TestHyundaiSafety): - def setUp(self): - self.packer = CANPackerPanda("hyundai_kia_generic") - self.safety = libsafety_py.libsafety - self.safety.set_safety_hooks(CarParams.SafetyModel.hyundai, HyundaiSafetyFlags.FCEV_GAS) - self.safety.init_tests() - - def _user_gas_msg(self, gas): - values = {"ACCELERATOR_PEDAL": gas} - return self.packer.make_can_msg_panda("FCEV_ACCELERATOR", 0, values) - - -class TestHyundaiLegacySafety(TestHyundaiSafety): - def setUp(self): - self.packer = CANPackerPanda("hyundai_kia_generic") - self.safety = libsafety_py.libsafety - self.safety.set_safety_hooks(CarParams.SafetyModel.hyundaiLegacy, 0) - self.safety.init_tests() - - -class TestHyundaiLegacySafetyEV(TestHyundaiSafety): - def setUp(self): - self.packer = CANPackerPanda("hyundai_kia_generic") - self.safety = libsafety_py.libsafety - self.safety.set_safety_hooks(CarParams.SafetyModel.hyundaiLegacy, 1) - self.safety.init_tests() - - def _user_gas_msg(self, gas): - values = {"Accel_Pedal_Pos": gas} - return self.packer.make_can_msg_panda("E_EMS11", 0, values, fix_checksum=checksum) - - -class TestHyundaiLegacySafetyHEV(TestHyundaiSafety): - def setUp(self): - self.packer = CANPackerPanda("hyundai_kia_generic") - self.safety = libsafety_py.libsafety - self.safety.set_safety_hooks(CarParams.SafetyModel.hyundaiLegacy, 2) - self.safety.init_tests() - - def _user_gas_msg(self, gas): - values = {"CR_Vcu_AccPedDep_Pos": gas} - return self.packer.make_can_msg_panda("E_EMS11", 0, values, fix_checksum=checksum) - -class TestHyundaiLongitudinalSafety(HyundaiLongitudinalBase, TestHyundaiSafety): - TX_MSGS = [[0x340, 0], [0x4F1, 0], [0x485, 0], [0x420, 0], [0x421, 0], [0x50A, 0], [0x389, 0], [0x4A2, 0], [0x38D, 0], [0x483, 0], [0x7D0, 0]] - - RELAY_MALFUNCTION_ADDRS = {0: (0x340, 0x421)} # LKAS11, SCC12 - - DISABLED_ECU_UDS_MSG = (0x7D0, 0) - DISABLED_ECU_ACTUATION_MSG = (0x421, 0) - - def setUp(self): - self.packer = CANPackerPanda("hyundai_kia_generic") - self.safety = libsafety_py.libsafety - self.safety.set_safety_hooks(CarParams.SafetyModel.hyundai, HyundaiSafetyFlags.LONG) - self.safety.init_tests() - - def _accel_msg(self, accel, aeb_req=False, aeb_decel=0): - values = { - "aReqRaw": accel, - "aReqValue": accel, - "AEB_CmdAct": int(aeb_req), - "CR_VSM_DecCmd": aeb_decel, - } - return self.packer.make_can_msg_panda("SCC12", self.SCC_BUS, values) - - def _fca11_msg(self, idx=0, vsm_aeb_req=False, fca_aeb_req=False, aeb_decel=0): - values = { - "CR_FCA_Alive": idx % 0xF, - "FCA_Status": 2, - "CR_VSM_DecCmd": aeb_decel, - "CF_VSM_DecCmdAct": int(vsm_aeb_req), - "FCA_CmdAct": int(fca_aeb_req), - } - return self.packer.make_can_msg_panda("FCA11", 0, values) - - def test_no_aeb_fca11(self): - self.assertTrue(self._tx(self._fca11_msg())) - self.assertFalse(self._tx(self._fca11_msg(vsm_aeb_req=True))) - self.assertFalse(self._tx(self._fca11_msg(fca_aeb_req=True))) - self.assertFalse(self._tx(self._fca11_msg(aeb_decel=1.0))) - - def test_no_aeb_scc12(self): - self.assertTrue(self._tx(self._accel_msg(0))) - self.assertFalse(self._tx(self._accel_msg(0, aeb_req=True))) - self.assertFalse(self._tx(self._accel_msg(0, aeb_decel=1.0))) - - -class TestHyundaiLongitudinalSafetyCameraSCC(HyundaiLongitudinalBase, TestHyundaiSafety): - TX_MSGS = [[0x340, 0], [0x4F1, 2], [0x485, 0], [0x420, 0], [0x421, 0], [0x50A, 0], [0x389, 0], [0x4A2, 0]] - - FWD_BLACKLISTED_ADDRS = {2: [0x340, 0x485, 0x420, 0x421, 0x50A, 0x389]} - - def setUp(self): - self.packer = CANPackerPanda("hyundai_kia_generic") - self.safety = libsafety_py.libsafety - self.safety.set_safety_hooks(CarParams.SafetyModel.hyundai, HyundaiSafetyFlags.LONG | HyundaiSafetyFlags.CAMERA_SCC) - self.safety.init_tests() - - def _accel_msg(self, accel, aeb_req=False, aeb_decel=0): - values = { - "aReqRaw": accel, - "aReqValue": accel, - "AEB_CmdAct": int(aeb_req), - "CR_VSM_DecCmd": aeb_decel, - } - return self.packer.make_can_msg_panda("SCC12", self.SCC_BUS, values) - - def test_no_aeb_scc12(self): - self.assertTrue(self._tx(self._accel_msg(0))) - self.assertFalse(self._tx(self._accel_msg(0, aeb_req=True))) - self.assertFalse(self._tx(self._accel_msg(0, aeb_decel=1.0))) - - def test_tester_present_allowed(self): - pass - - def test_disabled_ecu_alive(self): - pass - - -if __name__ == "__main__": - unittest.main() diff --git a/opendbc/safety/tests/test_hyundai_canfd.py b/opendbc/safety/tests/test_hyundai_canfd.py deleted file mode 100755 index 7b6fdd8bbf9..00000000000 --- a/opendbc/safety/tests/test_hyundai_canfd.py +++ /dev/null @@ -1,286 +0,0 @@ -#!/usr/bin/env python3 -from parameterized import parameterized_class -import unittest - -from opendbc.car.hyundai.values import HyundaiSafetyFlags -from opendbc.car.structs import CarParams -from opendbc.safety.tests.libsafety import libsafety_py -import opendbc.safety.tests.common as common -from opendbc.safety.tests.common import CANPackerPanda -from opendbc.safety.tests.hyundai_common import HyundaiButtonBase, HyundaiLongitudinalBase - - -class TestHyundaiCanfdBase(HyundaiButtonBase, common.PandaCarSafetyTest, common.DriverTorqueSteeringSafetyTest, common.SteerRequestCutSafetyTest): - - TX_MSGS = [[0x50, 0], [0x1CF, 1], [0x2A4, 0]] - STANDSTILL_THRESHOLD = 12 # 0.375 kph - FWD_BLACKLISTED_ADDRS = {2: [0x50, 0x2a4]} - - MAX_RATE_UP = 2 - MAX_RATE_DOWN = 3 - MAX_TORQUE = 270 - - MAX_RT_DELTA = 112 - RT_INTERVAL = 250000 - - DRIVER_TORQUE_ALLOWANCE = 250 - DRIVER_TORQUE_FACTOR = 2 - - # Safety around steering req bit - MIN_VALID_STEERING_FRAMES = 89 - MAX_INVALID_STEERING_FRAMES = 2 - MIN_VALID_STEERING_RT_INTERVAL = 810000 # a ~10% buffer, can send steer up to 110Hz - - PT_BUS = 0 - SCC_BUS = 2 - STEER_BUS = 0 - STEER_MSG = "" - GAS_MSG = ("", "") - BUTTONS_TX_BUS = 1 - - @classmethod - def setUpClass(cls): - super().setUpClass() - if cls.__name__ == "TestHyundaiCanfdBase": - cls.packer = None - cls.safety = None - raise unittest.SkipTest - - def _torque_driver_msg(self, torque): - values = {"STEERING_COL_TORQUE": torque} - return self.packer.make_can_msg_panda("MDPS", self.PT_BUS, values) - - def _torque_cmd_msg(self, torque, steer_req=1): - values = {"TORQUE_REQUEST": torque, "STEER_REQ": steer_req} - return self.packer.make_can_msg_panda(self.STEER_MSG, self.STEER_BUS, values) - - def _speed_msg(self, speed): - values = {f"WHL_Spd{pos}Val": speed * 0.03125 for pos in ["FL", "FR", "RL", "RR"]} - return self.packer.make_can_msg_panda("WHEEL_SPEEDS", self.PT_BUS, values) - - def _user_brake_msg(self, brake): - values = {"DriverBraking": brake} - return self.packer.make_can_msg_panda("TCS", self.PT_BUS, values) - - def _user_gas_msg(self, gas): - values = {self.GAS_MSG[1]: gas} - return self.packer.make_can_msg_panda(self.GAS_MSG[0], self.PT_BUS, values) - - def _pcm_status_msg(self, enable): - values = {"ACCMode": 1 if enable else 0} - return self.packer.make_can_msg_panda("SCC_CONTROL", self.SCC_BUS, values) - - def _button_msg(self, buttons, main_button=0, bus=None): - if bus is None: - bus = self.PT_BUS - values = { - "CRUISE_BUTTONS": buttons, - "ADAPTIVE_CRUISE_MAIN_BTN": main_button, - } - return self.packer.make_can_msg_panda("CRUISE_BUTTONS", bus, values) - - -class TestHyundaiCanfdLFASteeringBase(TestHyundaiCanfdBase): - - TX_MSGS = [[0x12A, 0], [0x1A0, 1], [0x1CF, 0], [0x1E0, 0]] - RELAY_MALFUNCTION_ADDRS = {0: (0x12A,)} # LFA - FWD_BLACKLISTED_ADDRS = {2: [0x12A, 0x1E0]} - - STEER_MSG = "LFA" - BUTTONS_TX_BUS = 2 - SAFETY_PARAM: int - - @classmethod - def setUpClass(cls): - super().setUpClass() - if cls.__name__ in ("TestHyundaiCanfdLFASteering", "TestHyundaiCanfdLFASteeringAltButtons"): - cls.packer = None - cls.safety = None - raise unittest.SkipTest - - def setUp(self): - self.packer = CANPackerPanda("hyundai_canfd_generated") - self.safety = libsafety_py.libsafety - self.safety.set_safety_hooks(CarParams.SafetyModel.hyundaiCanfd, self.SAFETY_PARAM) - self.safety.init_tests() - - -@parameterized_class([ - # Radar SCC - {"GAS_MSG": ("ACCELERATOR_BRAKE_ALT", "ACCELERATOR_PEDAL_PRESSED"), "SCC_BUS": 0, "SAFETY_PARAM": 0}, - {"GAS_MSG": ("ACCELERATOR", "ACCELERATOR_PEDAL"), "SCC_BUS": 0, "SAFETY_PARAM": HyundaiSafetyFlags.EV_GAS}, - {"GAS_MSG": ("ACCELERATOR_ALT", "ACCELERATOR_PEDAL"), "SCC_BUS": 0, "SAFETY_PARAM": HyundaiSafetyFlags.HYBRID_GAS}, - # Camera SCC - {"GAS_MSG": ("ACCELERATOR_BRAKE_ALT", "ACCELERATOR_PEDAL_PRESSED"), "SCC_BUS": 2, "SAFETY_PARAM": HyundaiSafetyFlags.CAMERA_SCC}, - {"GAS_MSG": ("ACCELERATOR", "ACCELERATOR_PEDAL"), "SCC_BUS": 2, "SAFETY_PARAM": HyundaiSafetyFlags.EV_GAS | - HyundaiSafetyFlags.CAMERA_SCC}, - {"GAS_MSG": ("ACCELERATOR_ALT", "ACCELERATOR_PEDAL"), "SCC_BUS": 2, "SAFETY_PARAM": HyundaiSafetyFlags.HYBRID_GAS | - HyundaiSafetyFlags.CAMERA_SCC}, -]) -class TestHyundaiCanfdLFASteering(TestHyundaiCanfdLFASteeringBase): - pass - - -@parameterized_class([ - # Radar SCC - {"GAS_MSG": ("ACCELERATOR_BRAKE_ALT", "ACCELERATOR_PEDAL_PRESSED"), "SCC_BUS": 0, "SAFETY_PARAM": 0}, - {"GAS_MSG": ("ACCELERATOR", "ACCELERATOR_PEDAL"), "SCC_BUS": 0, "SAFETY_PARAM": HyundaiSafetyFlags.EV_GAS}, - {"GAS_MSG": ("ACCELERATOR_ALT", "ACCELERATOR_PEDAL"), "SCC_BUS": 0, "SAFETY_PARAM": HyundaiSafetyFlags.HYBRID_GAS}, - # Camera SCC - {"GAS_MSG": ("ACCELERATOR_BRAKE_ALT", "ACCELERATOR_PEDAL_PRESSED"), "SCC_BUS": 2, "SAFETY_PARAM": HyundaiSafetyFlags.CAMERA_SCC}, - {"GAS_MSG": ("ACCELERATOR", "ACCELERATOR_PEDAL"), "SCC_BUS": 2, "SAFETY_PARAM": HyundaiSafetyFlags.EV_GAS | - HyundaiSafetyFlags.CAMERA_SCC}, - {"GAS_MSG": ("ACCELERATOR_ALT", "ACCELERATOR_PEDAL"), "SCC_BUS": 2, "SAFETY_PARAM": HyundaiSafetyFlags.HYBRID_GAS | - HyundaiSafetyFlags.CAMERA_SCC}, -]) -class TestHyundaiCanfdLFASteeringAltButtons(TestHyundaiCanfdLFASteeringBase): - - SAFETY_PARAM: int - - def setUp(self): - self.packer = CANPackerPanda("hyundai_canfd_generated") - self.safety = libsafety_py.libsafety - self.safety.set_safety_hooks(CarParams.SafetyModel.hyundaiCanfd, HyundaiSafetyFlags.CANFD_ALT_BUTTONS | self.SAFETY_PARAM) - self.safety.init_tests() - - def _button_msg(self, buttons, main_button=0, bus=1): - values = { - "CRUISE_BUTTONS": buttons, - "ADAPTIVE_CRUISE_MAIN_BTN": main_button, - } - return self.packer.make_can_msg_panda("CRUISE_BUTTONS_ALT", self.PT_BUS, values) - - def _acc_cancel_msg(self, cancel, accel=0): - values = {"ACCMode": 4 if cancel else 0, "aReqRaw": accel, "aReqValue": accel} - return self.packer.make_can_msg_panda("SCC_CONTROL", self.PT_BUS, values) - - def test_button_sends(self): - """ - No button send allowed with alt buttons. - """ - for enabled in (True, False): - for btn in range(8): - self.safety.set_controls_allowed(enabled) - self.assertFalse(self._tx(self._button_msg(btn))) - - def test_acc_cancel(self): - # FIXME: the CANFD_ALT_BUTTONS cars are the only ones that use SCC_CONTROL to cancel, why can't we use buttons? - for enabled in (True, False): - self.safety.set_controls_allowed(enabled) - self.assertTrue(self._tx(self._acc_cancel_msg(True))) - self.assertFalse(self._tx(self._acc_cancel_msg(True, accel=1))) - self.assertFalse(self._tx(self._acc_cancel_msg(False))) - - -class TestHyundaiCanfdLKASteeringEV(TestHyundaiCanfdBase): - - TX_MSGS = [[0x50, 0], [0x1CF, 1], [0x2A4, 0]] - RELAY_MALFUNCTION_ADDRS = {0: (0x50,)} # LKAS - FWD_BLACKLISTED_ADDRS = {2: [0x50, 0x2a4]} - - PT_BUS = 1 - SCC_BUS = 1 - STEER_MSG = "LKAS" - GAS_MSG = ("ACCELERATOR", "ACCELERATOR_PEDAL") - - def setUp(self): - self.packer = CANPackerPanda("hyundai_canfd_generated") - self.safety = libsafety_py.libsafety - self.safety.set_safety_hooks(CarParams.SafetyModel.hyundaiCanfd, HyundaiSafetyFlags.CANFD_LKA_STEERING | HyundaiSafetyFlags.EV_GAS) - self.safety.init_tests() - - -# TODO: Handle ICE and HEV configurations once we see cars that use the new messages -class TestHyundaiCanfdLKASteeringAltEV(TestHyundaiCanfdBase): - - TX_MSGS = [[0x110, 0], [0x1CF, 1], [0x362, 0]] - RELAY_MALFUNCTION_ADDRS = {0: (0x110,)} # LKAS_ALT - FWD_BLACKLISTED_ADDRS = {2: [0x110, 0x362]} - - PT_BUS = 1 - SCC_BUS = 1 - STEER_MSG = "LKAS_ALT" - GAS_MSG = ("ACCELERATOR", "ACCELERATOR_PEDAL") - - def setUp(self): - self.packer = CANPackerPanda("hyundai_canfd_generated") - self.safety = libsafety_py.libsafety - self.safety.set_safety_hooks(CarParams.SafetyModel.hyundaiCanfd, HyundaiSafetyFlags.CANFD_LKA_STEERING | HyundaiSafetyFlags.EV_GAS | - HyundaiSafetyFlags.CANFD_LKA_STEERING_ALT) - self.safety.init_tests() - - -class TestHyundaiCanfdLKASteeringLongEV(HyundaiLongitudinalBase, TestHyundaiCanfdLKASteeringEV): - - TX_MSGS = [[0x50, 0], [0x1CF, 1], [0x2A4, 0], [0x51, 0], [0x730, 1], [0x12a, 1], [0x160, 1], - [0x1e0, 1], [0x1a0, 1], [0x1ea, 1], [0x200, 1], [0x345, 1], [0x1da, 1]] - - RELAY_MALFUNCTION_ADDRS = {0: (0x50,), 1: (0x1a0,)} # LKAS, SCC_CONTROL - - DISABLED_ECU_UDS_MSG = (0x730, 1) - DISABLED_ECU_ACTUATION_MSG = (0x1a0, 1) - - STEER_MSG = "LFA" - GAS_MSG = ("ACCELERATOR", "ACCELERATOR_PEDAL") - STEER_BUS = 1 - - def setUp(self): - self.packer = CANPackerPanda("hyundai_canfd_generated") - self.safety = libsafety_py.libsafety - self.safety.set_safety_hooks(CarParams.SafetyModel.hyundaiCanfd, HyundaiSafetyFlags.CANFD_LKA_STEERING | - HyundaiSafetyFlags.LONG | HyundaiSafetyFlags.EV_GAS) - self.safety.init_tests() - - def _accel_msg(self, accel, aeb_req=False, aeb_decel=0): - values = { - "aReqRaw": accel, - "aReqValue": accel, - } - return self.packer.make_can_msg_panda("SCC_CONTROL", 1, values) - - -# Tests longitudinal for ICE, hybrid, EV cars with LFA steering -@parameterized_class([ - # Radar SCC - {"GAS_MSG": ("ACCELERATOR_BRAKE_ALT", "ACCELERATOR_PEDAL_PRESSED"), "SCC_BUS": 0, "SAFETY_PARAM": 0}, - {"GAS_MSG": ("ACCELERATOR", "ACCELERATOR_PEDAL"), "SCC_BUS": 0, "SAFETY_PARAM": HyundaiSafetyFlags.EV_GAS}, - {"GAS_MSG": ("ACCELERATOR_ALT", "ACCELERATOR_PEDAL"), "SCC_BUS": 0, "SAFETY_PARAM": HyundaiSafetyFlags.HYBRID_GAS}, - # Camera SCC - {"GAS_MSG": ("ACCELERATOR_BRAKE_ALT", "ACCELERATOR_PEDAL_PRESSED"), "SCC_BUS": 2, "SAFETY_PARAM": HyundaiSafetyFlags.CAMERA_SCC}, - {"GAS_MSG": ("ACCELERATOR", "ACCELERATOR_PEDAL"), "SCC_BUS": 2, "SAFETY_PARAM": HyundaiSafetyFlags.EV_GAS | HyundaiSafetyFlags.CAMERA_SCC}, - {"GAS_MSG": ("ACCELERATOR_ALT", "ACCELERATOR_PEDAL"), "SCC_BUS": 2, "SAFETY_PARAM": HyundaiSafetyFlags.HYBRID_GAS | HyundaiSafetyFlags.CAMERA_SCC}, -]) -class TestHyundaiCanfdLFASteeringLong(HyundaiLongitudinalBase, TestHyundaiCanfdLFASteeringBase): - - FWD_BLACKLISTED_ADDRS = {2: [0x12a, 0x1e0, 0x1a0, 0x160]} - - RELAY_MALFUNCTION_ADDRS = {0: (0x12A, 0x1a0)} # LFA, SCC_CONTROL - - DISABLED_ECU_UDS_MSG = (0x7D0, 0) - DISABLED_ECU_ACTUATION_MSG = (0x1a0, 0) - - @classmethod - def setUpClass(cls): - if cls.__name__ == "TestHyundaiCanfdLFASteeringLong": - cls.safety = None - raise unittest.SkipTest - - def setUp(self): - self.packer = CANPackerPanda("hyundai_canfd_generated") - self.safety = libsafety_py.libsafety - self.safety.set_safety_hooks(CarParams.SafetyModel.hyundaiCanfd, HyundaiSafetyFlags.LONG | self.SAFETY_PARAM) - self.safety.init_tests() - - def _accel_msg(self, accel, aeb_req=False, aeb_decel=0): - values = { - "aReqRaw": accel, - "aReqValue": accel, - } - return self.packer.make_can_msg_panda("SCC_CONTROL", 0, values) - - def test_tester_present_allowed(self, ecu_disable: bool = True): - super().test_tester_present_allowed(ecu_disable=not self.SAFETY_PARAM & HyundaiSafetyFlags.CAMERA_SCC) - - -if __name__ == "__main__": - unittest.main() diff --git a/opendbc/safety/tests/test_mazda.py b/opendbc/safety/tests/test_mazda.py deleted file mode 100755 index e60248d2d15..00000000000 --- a/opendbc/safety/tests/test_mazda.py +++ /dev/null @@ -1,86 +0,0 @@ -#!/usr/bin/env python3 -import unittest - -from opendbc.car.structs import CarParams -from opendbc.safety.tests.libsafety import libsafety_py -import opendbc.safety.tests.common as common -from opendbc.safety.tests.common import CANPackerPanda - - -class TestMazdaSafety(common.PandaCarSafetyTest, common.DriverTorqueSteeringSafetyTest): - - TX_MSGS = [[0x243, 0], [0x09d, 0], [0x440, 0]] - STANDSTILL_THRESHOLD = .1 - RELAY_MALFUNCTION_ADDRS = {0: (0x243,)} - FWD_BLACKLISTED_ADDRS = {2: [0x243, 0x440]} - - MAX_RATE_UP = 10 - MAX_RATE_DOWN = 25 - MAX_TORQUE = 800 - - MAX_RT_DELTA = 300 - RT_INTERVAL = 250000 - - DRIVER_TORQUE_ALLOWANCE = 15 - DRIVER_TORQUE_FACTOR = 1 - - # Mazda actually does not set any bit when requesting torque - NO_STEER_REQ_BIT = True - - def setUp(self): - self.packer = CANPackerPanda("mazda_2017") - self.safety = libsafety_py.libsafety - self.safety.set_safety_hooks(CarParams.SafetyModel.mazda, 0) - self.safety.init_tests() - - def _torque_meas_msg(self, torque): - values = {"STEER_TORQUE_MOTOR": torque} - return self.packer.make_can_msg_panda("STEER_TORQUE", 0, values) - - def _torque_driver_msg(self, torque): - values = {"STEER_TORQUE_SENSOR": torque} - return self.packer.make_can_msg_panda("STEER_TORQUE", 0, values) - - def _torque_cmd_msg(self, torque, steer_req=1): - values = {"LKAS_REQUEST": torque} - return self.packer.make_can_msg_panda("CAM_LKAS", 0, values) - - def _speed_msg(self, speed): - values = {"SPEED": speed} - return self.packer.make_can_msg_panda("ENGINE_DATA", 0, values) - - def _user_brake_msg(self, brake): - values = {"BRAKE_ON": brake} - return self.packer.make_can_msg_panda("PEDALS", 0, values) - - def _user_gas_msg(self, gas): - values = {"PEDAL_GAS": gas} - return self.packer.make_can_msg_panda("ENGINE_DATA", 0, values) - - def _pcm_status_msg(self, enable): - values = {"CRZ_ACTIVE": enable} - return self.packer.make_can_msg_panda("CRZ_CTRL", 0, values) - - def _button_msg(self, resume=False, cancel=False): - values = { - "CAN_OFF": cancel, - "CAN_OFF_INV": (cancel + 1) % 2, - "RES": resume, - "RES_INV": (resume + 1) % 2, - } - return self.packer.make_can_msg_panda("CRZ_BTNS", 0, values) - - def test_buttons(self): - # only cancel allows while controls not allowed - self.safety.set_controls_allowed(0) - self.assertTrue(self._tx(self._button_msg(cancel=True))) - self.assertFalse(self._tx(self._button_msg(resume=True))) - - # do not block resume if we are engaged already - self.safety.set_controls_allowed(1) - self.assertTrue(self._tx(self._button_msg(cancel=True))) - self.assertTrue(self._tx(self._button_msg(resume=True))) - - -if __name__ == "__main__": - unittest.main() diff --git a/opendbc/safety/tests/test_nissan.py b/opendbc/safety/tests/test_nissan.py deleted file mode 100755 index 22f556f4dc1..00000000000 --- a/opendbc/safety/tests/test_nissan.py +++ /dev/null @@ -1,118 +0,0 @@ -#!/usr/bin/env python3 -import unittest - -from opendbc.car.nissan.values import NissanSafetyFlags -from opendbc.car.structs import CarParams -from opendbc.safety.tests.libsafety import libsafety_py -import opendbc.safety.tests.common as common -from opendbc.safety.tests.common import CANPackerPanda - - -class TestNissanSafety(common.PandaCarSafetyTest, common.AngleSteeringSafetyTest): - - TX_MSGS = [[0x169, 0], [0x2b1, 0], [0x4cc, 0], [0x20b, 2], [0x280, 2]] - GAS_PRESSED_THRESHOLD = 3 - RELAY_MALFUNCTION_ADDRS = {0: (0x169,)} - FWD_BLACKLISTED_ADDRS = {0: [0x280], 2: [0x169, 0x2b1, 0x4cc]} - - EPS_BUS = 0 - CRUISE_BUS = 2 - - # Angle control limits - STEER_ANGLE_MAX = 600 # deg, reasonable limit - DEG_TO_CAN = 100 - - ANGLE_RATE_BP = [0., 5., 15.] - ANGLE_RATE_UP = [5., .8, .15] # windup limit - ANGLE_RATE_DOWN = [5., 3.5, .4] # unwind limit - - def setUp(self): - self.packer = CANPackerPanda("nissan_x_trail_2017_generated") - self.safety = libsafety_py.libsafety - self.safety.set_safety_hooks(CarParams.SafetyModel.nissan, 0) - self.safety.init_tests() - - def _angle_cmd_msg(self, angle: float, enabled: bool): - values = {"DESIRED_ANGLE": angle, "LKA_ACTIVE": 1 if enabled else 0} - return self.packer.make_can_msg_panda("LKAS", 0, values) - - def _angle_meas_msg(self, angle: float): - values = {"STEER_ANGLE": angle} - return self.packer.make_can_msg_panda("STEER_ANGLE_SENSOR", self.EPS_BUS, values) - - def _pcm_status_msg(self, enable): - values = {"CRUISE_ENABLED": enable} - return self.packer.make_can_msg_panda("CRUISE_STATE", self.CRUISE_BUS, values) - - def _speed_msg(self, speed): - values = {"WHEEL_SPEED_%s" % s: speed * 3.6 for s in ["RR", "RL"]} - return self.packer.make_can_msg_panda("WHEEL_SPEEDS_REAR", self.EPS_BUS, values) - - def _user_brake_msg(self, brake): - values = {"USER_BRAKE_PRESSED": brake} - return self.packer.make_can_msg_panda("DOORS_LIGHTS", self.EPS_BUS, values) - - def _user_gas_msg(self, gas): - values = {"GAS_PEDAL": gas} - return self.packer.make_can_msg_panda("GAS_PEDAL", self.EPS_BUS, values) - - def _acc_button_cmd(self, cancel=0, propilot=0, flw_dist=0, _set=0, res=0): - no_button = not any([cancel, propilot, flw_dist, _set, res]) - values = {"CANCEL_BUTTON": cancel, "PROPILOT_BUTTON": propilot, - "FOLLOW_DISTANCE_BUTTON": flw_dist, "SET_BUTTON": _set, - "RES_BUTTON": res, "NO_BUTTON_PRESSED": no_button} - return self.packer.make_can_msg_panda("CRUISE_THROTTLE", 2, values) - - def test_acc_buttons(self): - btns = [ - ("cancel", True), - ("propilot", False), - ("flw_dist", False), - ("_set", False), - ("res", False), - (None, False), - ] - for controls_allowed in (True, False): - for btn, should_tx in btns: - self.safety.set_controls_allowed(controls_allowed) - args = {} if btn is None else {btn: 1} - tx = self._tx(self._acc_button_cmd(**args)) - self.assertEqual(tx, should_tx) - - -class TestNissanSafetyAltEpsBus(TestNissanSafety): - """Altima uses different buses""" - - EPS_BUS = 1 - CRUISE_BUS = 1 - - def setUp(self): - self.packer = CANPackerPanda("nissan_x_trail_2017_generated") - self.safety = libsafety_py.libsafety - self.safety.set_safety_hooks(CarParams.SafetyModel.nissan, NissanSafetyFlags.ALT_EPS_BUS) - self.safety.init_tests() - - -class TestNissanLeafSafety(TestNissanSafety): - - def setUp(self): - self.packer = CANPackerPanda("nissan_leaf_2018_generated") - self.safety = libsafety_py.libsafety - self.safety.set_safety_hooks(CarParams.SafetyModel.nissan, 0) - self.safety.init_tests() - - def _user_brake_msg(self, brake): - values = {"USER_BRAKE_PRESSED": brake} - return self.packer.make_can_msg_panda("CRUISE_THROTTLE", 0, values) - - def _user_gas_msg(self, gas): - values = {"GAS_PEDAL": gas} - return self.packer.make_can_msg_panda("CRUISE_THROTTLE", 0, values) - - # TODO: leaf should use its own safety param - def test_acc_buttons(self): - pass - - -if __name__ == "__main__": - unittest.main() diff --git a/opendbc/safety/tests/test_rivian.py b/opendbc/safety/tests/test_rivian.py deleted file mode 100755 index 7dc40724157..00000000000 --- a/opendbc/safety/tests/test_rivian.py +++ /dev/null @@ -1,109 +0,0 @@ -#!/usr/bin/env python3 -import unittest - -from opendbc.car.structs import CarParams -from opendbc.safety.tests.libsafety import libsafety_py -import opendbc.safety.tests.common as common -from opendbc.safety.tests.common import CANPackerPanda -from opendbc.car.rivian.values import RivianSafetyFlags - - -class TestRivianSafetyBase(common.PandaCarSafetyTest, common.DriverTorqueSteeringSafetyTest, common.LongitudinalAccelSafetyTest): - - TX_MSGS = [[0x120, 0], [0x321, 2], [0x162, 2]] - RELAY_MALFUNCTION_ADDRS = {0: (0x120,)} - FWD_BLACKLISTED_ADDRS = {0: [0x321, 0x162], 2: [0x120]} - - MAX_TORQUE = 250 - MAX_RATE_UP = 3 - MAX_RATE_DOWN = 5 - - MAX_RT_DELTA = 125 - RT_INTERVAL = 250000 - - DRIVER_TORQUE_ALLOWANCE = 100 - DRIVER_TORQUE_FACTOR = 2 - - @classmethod - def setUpClass(cls): - if cls.__name__ == "TestRivianSafetyBase": - raise unittest.SkipTest - - def _torque_driver_msg(self, torque): - values = {"EPAS_TorsionBarTorque": torque / 100.0} - return self.packer.make_can_msg_panda("EPAS_SystemStatus", 0, values) - - def _torque_cmd_msg(self, torque, steer_req=1): - values = {"ACM_lkaStrToqReq": torque, "ACM_lkaActToi": steer_req} - return self.packer.make_can_msg_panda("ACM_lkaHbaCmd", 0, values) - - def _speed_msg(self, speed): - values = {"ESP_Status": speed * 3.6} - return self.packer.make_can_msg_panda("ESP_Vehicle_Speed", 0, values) - - def _user_brake_msg(self, brake): - values = {"iBESP2_BrakePedalApplied": brake} - return self.packer.make_can_msg_panda("iBESP2", 0, values) - - def _user_gas_msg(self, gas): - values = {"VDM_AcceleratorPedalPosition": gas} - return self.packer.make_can_msg_panda("VDM_PropStatus", 0, values) - - def _pcm_status_msg(self, enable): - values = {"ACM_FeatureStatus": enable, "ACM_Unkown1": 1} - return self.packer.make_can_msg_panda("ACM_Status", 2, values) - - def _vehicle_moving_msg(self, speed: float): - values = {"ESP_Vehicle_Speed": speed} - return self.packer.make_can_msg_panda("ESP_Status", 0, values) - - def _accel_msg(self, accel: float): - values = {"ACM_AccelerationRequest": accel} - return self.packer.make_can_msg_panda("ACM_longitudinalRequest", 0, values) - - def test_wheel_touch(self): - # For hiding hold wheel alert on engage - for controls_allowed in (True, False): - self.safety.set_controls_allowed(controls_allowed) - values = { - "SCCM_WheelTouch_HandsOn": 1 if controls_allowed else 0, - "SCCM_WheelTouch_CapacitiveValue": 100 if controls_allowed else 0, - "SETME_X52": 100, - } - self.assertTrue(self._tx(self.packer.make_can_msg_panda("SCCM_WheelTouch", 2, values))) - - -class TestRivianStockSafety(TestRivianSafetyBase): - - LONGITUDINAL = False - - def setUp(self): - self.packer = CANPackerPanda("rivian_primary_actuator") - self.safety = libsafety_py.libsafety - self.safety.set_safety_hooks(CarParams.SafetyModel.rivian, 0) - self.safety.init_tests() - - def test_adas_status(self): - # For canceling stock ACC - for controls_allowed in (True, False): - self.safety.set_controls_allowed(controls_allowed) - for interface_status in range(4): - values = {"VDM_AdasInterfaceStatus": interface_status} - self.assertTrue(self._tx(self.packer.make_can_msg_panda("VDM_AdasSts", 2, values))) - - -class TestRivianLongitudinalSafety(TestRivianSafetyBase): - - TX_MSGS = [[0x120, 0], [0x321, 2], [0x160, 0]] - RELAY_MALFUNCTION_ADDRS = {0: (0x120, 0x160)} - FWD_BLACKLISTED_ADDRS = {0: [0x321], 2: [0x120, 0x160]} - - def setUp(self): - self.packer = CANPackerPanda("rivian_primary_actuator") - self.safety = libsafety_py.libsafety - self.safety.set_safety_hooks(CarParams.SafetyModel.rivian, RivianSafetyFlags.LONG_CONTROL) - self.safety.init_tests() - - -if __name__ == "__main__": - unittest.main() diff --git a/opendbc/safety/tests/test_subaru.py b/opendbc/safety/tests/test_subaru.py deleted file mode 100755 index 87277324008..00000000000 --- a/opendbc/safety/tests/test_subaru.py +++ /dev/null @@ -1,228 +0,0 @@ -#!/usr/bin/env python3 -import enum -import unittest - -from opendbc.car.subaru.values import SubaruSafetyFlags -from opendbc.car.structs import CarParams -from opendbc.safety.tests.libsafety import libsafety_py -import opendbc.safety.tests.common as common -from opendbc.safety.tests.common import CANPackerPanda -from functools import partial - -class SubaruMsg(enum.IntEnum): - Brake_Status = 0x13c - CruiseControl = 0x240 - Throttle = 0x40 - Steering_Torque = 0x119 - Wheel_Speeds = 0x13a - ES_LKAS = 0x122 - ES_LKAS_ANGLE = 0x124 - ES_Brake = 0x220 - ES_Distance = 0x221 - ES_Status = 0x222 - ES_DashStatus = 0x321 - ES_LKAS_State = 0x322 - ES_Infotainment = 0x323 - ES_UDS_Request = 0x787 - ES_HighBeamAssist = 0x121 - ES_STATIC_1 = 0x22a - ES_STATIC_2 = 0x325 - - -SUBARU_MAIN_BUS = 0 -SUBARU_ALT_BUS = 1 -SUBARU_CAM_BUS = 2 - - -def lkas_tx_msgs(alt_bus, lkas_msg=SubaruMsg.ES_LKAS): - return [[lkas_msg, SUBARU_MAIN_BUS], - [SubaruMsg.ES_Distance, alt_bus], - [SubaruMsg.ES_DashStatus, SUBARU_MAIN_BUS], - [SubaruMsg.ES_LKAS_State, SUBARU_MAIN_BUS], - [SubaruMsg.ES_Infotainment, SUBARU_MAIN_BUS]] - -def long_tx_msgs(alt_bus): - return [[SubaruMsg.ES_Brake, alt_bus], - [SubaruMsg.ES_Status, alt_bus]] - -def gen2_long_additional_tx_msgs(): - return [[SubaruMsg.ES_UDS_Request, SUBARU_CAM_BUS], - [SubaruMsg.ES_HighBeamAssist, SUBARU_MAIN_BUS], - [SubaruMsg.ES_STATIC_1, SUBARU_MAIN_BUS], - [SubaruMsg.ES_STATIC_2, SUBARU_MAIN_BUS]] - -def fwd_blacklisted_addr(lkas_msg=SubaruMsg.ES_LKAS): - return {SUBARU_CAM_BUS: [lkas_msg, SubaruMsg.ES_DashStatus, SubaruMsg.ES_LKAS_State, SubaruMsg.ES_Infotainment]} - -class TestSubaruSafetyBase(common.PandaCarSafetyTest): - FLAGS = 0 - RELAY_MALFUNCTION_ADDRS = {SUBARU_MAIN_BUS: (SubaruMsg.ES_LKAS,)} - FWD_BLACKLISTED_ADDRS = fwd_blacklisted_addr() - - MAX_RT_DELTA = 940 - RT_INTERVAL = 250000 - - DRIVER_TORQUE_ALLOWANCE = 60 - DRIVER_TORQUE_FACTOR = 50 - - ALT_MAIN_BUS = SUBARU_MAIN_BUS - ALT_CAM_BUS = SUBARU_CAM_BUS - - DEG_TO_CAN = 100 - - INACTIVE_GAS = 1818 - - def setUp(self): - self.packer = CANPackerPanda("subaru_global_2017_generated") - self.safety = libsafety_py.libsafety - self.safety.set_safety_hooks(CarParams.SafetyModel.subaru, self.FLAGS) - self.safety.init_tests() - - def _set_prev_torque(self, t): - self.safety.set_desired_torque_last(t) - self.safety.set_rt_torque_last(t) - - def _torque_driver_msg(self, torque): - values = {"Steer_Torque_Sensor": torque} - return self.packer.make_can_msg_panda("Steering_Torque", 0, values) - - def _speed_msg(self, speed): - values = {s: speed for s in ["FR", "FL", "RR", "RL"]} - return self.packer.make_can_msg_panda("Wheel_Speeds", self.ALT_MAIN_BUS, values) - - def _angle_meas_msg(self, angle): - values = {"Steering_Angle": angle} - return self.packer.make_can_msg_panda("Steering_Torque", 0, values) - - def _user_brake_msg(self, brake): - values = {"Brake": brake} - return self.packer.make_can_msg_panda("Brake_Status", self.ALT_MAIN_BUS, values) - - def _user_gas_msg(self, gas): - values = {"Throttle_Pedal": gas} - return self.packer.make_can_msg_panda("Throttle", 0, values) - - def _pcm_status_msg(self, enable): - values = {"Cruise_Activated": enable} - return self.packer.make_can_msg_panda("CruiseControl", self.ALT_MAIN_BUS, values) - - -class TestSubaruStockLongitudinalSafetyBase(TestSubaruSafetyBase): - def _cancel_msg(self, cancel, cruise_throttle=0): - values = {"Cruise_Cancel": cancel, "Cruise_Throttle": cruise_throttle} - return self.packer.make_can_msg_panda("ES_Distance", self.ALT_MAIN_BUS, values) - - def test_cancel_message(self): - # test that we can only send the cancel message (ES_Distance) with inactive throttle (1818) and Cruise_Cancel=1 - for cancel in [True, False]: - self._generic_limit_safety_check(partial(self._cancel_msg, cancel), self.INACTIVE_GAS, self.INACTIVE_GAS, 0, 2**12, 1, self.INACTIVE_GAS, cancel) - - -class TestSubaruLongitudinalSafetyBase(TestSubaruSafetyBase, common.LongitudinalGasBrakeSafetyTest): - MIN_GAS = 808 - MAX_GAS = 3400 - INACTIVE_GAS = 1818 - MAX_POSSIBLE_GAS = 2**13 - - MIN_BRAKE = 0 - MAX_BRAKE = 600 - MAX_POSSIBLE_BRAKE = 2**16 - - MIN_RPM = 0 - MAX_RPM = 3600 - MAX_POSSIBLE_RPM = 2**13 - - FWD_BLACKLISTED_ADDRS = {2: [SubaruMsg.ES_LKAS, SubaruMsg.ES_Brake, SubaruMsg.ES_Distance, - SubaruMsg.ES_Status, SubaruMsg.ES_DashStatus, - SubaruMsg.ES_LKAS_State, SubaruMsg.ES_Infotainment]} - - def test_rpm_safety_check(self): - self._generic_limit_safety_check(self._send_rpm_msg, self.MIN_RPM, self.MAX_RPM, 0, self.MAX_POSSIBLE_RPM, 1) - - def _send_brake_msg(self, brake): - values = {"Brake_Pressure": brake} - return self.packer.make_can_msg_panda("ES_Brake", self.ALT_MAIN_BUS, values) - - def _send_gas_msg(self, gas): - values = {"Cruise_Throttle": gas} - return self.packer.make_can_msg_panda("ES_Distance", self.ALT_MAIN_BUS, values) - - def _send_rpm_msg(self, rpm): - values = {"Cruise_RPM": rpm} - return self.packer.make_can_msg_panda("ES_Status", self.ALT_MAIN_BUS, values) - - -class TestSubaruTorqueSafetyBase(TestSubaruSafetyBase, common.DriverTorqueSteeringSafetyTest, common.SteerRequestCutSafetyTest): - MAX_RATE_UP = 50 - MAX_RATE_DOWN = 70 - MAX_TORQUE = 2047 - - # Safety around steering req bit - MIN_VALID_STEERING_FRAMES = 7 - MAX_INVALID_STEERING_FRAMES = 1 - MIN_VALID_STEERING_RT_INTERVAL = 144000 - - def _torque_cmd_msg(self, torque, steer_req=1): - values = {"LKAS_Output": torque, "LKAS_Request": steer_req} - return self.packer.make_can_msg_panda("ES_LKAS", SUBARU_MAIN_BUS, values) - - -class TestSubaruGen1TorqueStockLongitudinalSafety(TestSubaruStockLongitudinalSafetyBase, TestSubaruTorqueSafetyBase): - FLAGS = 0 - TX_MSGS = lkas_tx_msgs(SUBARU_MAIN_BUS) - - -class TestSubaruGen2TorqueSafetyBase(TestSubaruTorqueSafetyBase): - ALT_MAIN_BUS = SUBARU_ALT_BUS - ALT_CAM_BUS = SUBARU_ALT_BUS - - MAX_RATE_UP = 40 - MAX_RATE_DOWN = 40 - MAX_TORQUE = 1000 - - -class TestSubaruGen2TorqueStockLongitudinalSafety(TestSubaruStockLongitudinalSafetyBase, TestSubaruGen2TorqueSafetyBase): - FLAGS = SubaruSafetyFlags.GEN2 - TX_MSGS = lkas_tx_msgs(SUBARU_ALT_BUS) - - -class TestSubaruGen1LongitudinalSafety(TestSubaruLongitudinalSafetyBase, TestSubaruTorqueSafetyBase): - FLAGS = SubaruSafetyFlags.LONG - TX_MSGS = lkas_tx_msgs(SUBARU_MAIN_BUS) + long_tx_msgs(SUBARU_MAIN_BUS) - - -class TestSubaruGen2LongitudinalSafety(TestSubaruLongitudinalSafetyBase, TestSubaruGen2TorqueSafetyBase): - FLAGS = SubaruSafetyFlags.LONG | SubaruSafetyFlags.GEN2 - TX_MSGS = lkas_tx_msgs(SUBARU_ALT_BUS) + long_tx_msgs(SUBARU_ALT_BUS) + gen2_long_additional_tx_msgs() - - def _rdbi_msg(self, did: int): - return b'\x03\x22' + did.to_bytes(2) + b'\x00\x00\x00\x00' - - def _es_uds_msg(self, msg: bytes): - return libsafety_py.make_CANPacket(SubaruMsg.ES_UDS_Request, 2, msg) - - def test_es_uds_message(self): - tester_present = b'\x02\x3E\x80\x00\x00\x00\x00\x00' - not_tester_present = b"\x03\xAA\xAA\x00\x00\x00\x00\x00" - - button_did = 0x1130 - - # Tester present is allowed for gen2 long to keep eyesight disabled - self.assertTrue(self._tx(self._es_uds_msg(tester_present))) - - # Non-Tester present is not allowed - self.assertFalse(self._tx(self._es_uds_msg(not_tester_present))) - - # Only button_did is allowed to be read via UDS - for did in range(0xFFFF): - should_tx = (did == button_did) - self.assertEqual(self._tx(self._es_uds_msg(self._rdbi_msg(did))), should_tx) - - # any other msg is not allowed - for sid in range(0xFF): - msg = b'\x03' + sid.to_bytes(1) + b'\x00' * 6 - self.assertFalse(self._tx(self._es_uds_msg(msg))) - - -if __name__ == "__main__": - unittest.main() diff --git a/opendbc/safety/tests/test_subaru_preglobal.py b/opendbc/safety/tests/test_subaru_preglobal.py deleted file mode 100755 index b2f482bf574..00000000000 --- a/opendbc/safety/tests/test_subaru_preglobal.py +++ /dev/null @@ -1,70 +0,0 @@ -#!/usr/bin/env python3 -import unittest - -from opendbc.car.structs import CarParams -from opendbc.car.subaru.values import SubaruSafetyFlags -from opendbc.safety.tests.libsafety import libsafety_py -import opendbc.safety.tests.common as common -from opendbc.safety.tests.common import CANPackerPanda - - -class TestSubaruPreglobalSafety(common.PandaCarSafetyTest, common.DriverTorqueSteeringSafetyTest): - FLAGS = 0 - DBC = "subaru_outback_2015_generated" - TX_MSGS = [[0x161, 0], [0x164, 0]] - RELAY_MALFUNCTION_ADDRS = {0: (0x164,)} - FWD_BLACKLISTED_ADDRS = {2: [0x161, 0x164]} - - MAX_RATE_UP = 50 - MAX_RATE_DOWN = 70 - MAX_TORQUE = 2047 - - MAX_RT_DELTA = 940 - RT_INTERVAL = 250000 - - DRIVER_TORQUE_ALLOWANCE = 75 - DRIVER_TORQUE_FACTOR = 10 - - def setUp(self): - self.packer = CANPackerPanda(self.DBC) - self.safety = libsafety_py.libsafety - self.safety.set_safety_hooks(CarParams.SafetyModel.subaruPreglobal, self.FLAGS) - self.safety.init_tests() - - def _set_prev_torque(self, t): - self.safety.set_desired_torque_last(t) - self.safety.set_rt_torque_last(t) - - def _torque_driver_msg(self, torque): - values = {"Steer_Torque_Sensor": torque} - return self.packer.make_can_msg_panda("Steering_Torque", 0, values) - - def _speed_msg(self, speed): - # subaru safety doesn't use the scaled value, so undo the scaling - values = {s: speed*0.0592 for s in ["FR", "FL", "RR", "RL"]} - return self.packer.make_can_msg_panda("Wheel_Speeds", 0, values) - - def _user_brake_msg(self, brake): - values = {"Brake_Pedal": brake} - return self.packer.make_can_msg_panda("Brake_Pedal", 0, values) - - def _torque_cmd_msg(self, torque, steer_req=1): - values = {"LKAS_Command": torque, "LKAS_Active": steer_req} - return self.packer.make_can_msg_panda("ES_LKAS", 0, values) - - def _user_gas_msg(self, gas): - values = {"Throttle_Pedal": gas} - return self.packer.make_can_msg_panda("Throttle", 0, values) - - def _pcm_status_msg(self, enable): - values = {"Cruise_Activated": enable} - return self.packer.make_can_msg_panda("CruiseControl", 0, values) - - -class TestSubaruPreglobalReversedDriverTorqueSafety(TestSubaruPreglobalSafety): - FLAGS = SubaruSafetyFlags.PREGLOBAL_REVERSED_DRIVER_TORQUE - DBC = "subaru_outback_2019_generated" - - -if __name__ == "__main__": - unittest.main() diff --git a/opendbc/safety/tests/test_tesla.py b/opendbc/safety/tests/test_tesla.py deleted file mode 100755 index 654a815bfb1..00000000000 --- a/opendbc/safety/tests/test_tesla.py +++ /dev/null @@ -1,174 +0,0 @@ -#!/usr/bin/env python3 -import unittest - -from opendbc.car.tesla.values import TeslaSafetyFlags -from opendbc.car.structs import CarParams -from opendbc.can.can_define import CANDefine -from opendbc.safety.tests.libsafety import libsafety_py -import opendbc.safety.tests.common as common -from opendbc.safety.tests.common import CANPackerPanda - -MSG_DAS_steeringControl = 0x488 -MSG_APS_eacMonitor = 0x27d -MSG_DAS_Control = 0x2b9 - - -class TestTeslaSafetyBase(common.PandaCarSafetyTest, common.AngleSteeringSafetyTest, common.LongitudinalAccelSafetyTest): - RELAY_MALFUNCTION_ADDRS = {0: (MSG_DAS_steeringControl, MSG_APS_eacMonitor)} - FWD_BLACKLISTED_ADDRS = {2: [MSG_DAS_steeringControl, MSG_APS_eacMonitor]} - TX_MSGS = [[MSG_DAS_steeringControl, 0], [MSG_APS_eacMonitor, 0], [MSG_DAS_Control, 0]] - - STANDSTILL_THRESHOLD = 0.1 - GAS_PRESSED_THRESHOLD = 3 - - # Angle control limits - STEER_ANGLE_MAX = 360 # deg - DEG_TO_CAN = 10 - - ANGLE_RATE_BP = [0., 5., 25.] - ANGLE_RATE_UP = [2.5, 1.5, 0.2] # windup limit - ANGLE_RATE_DOWN = [5., 2.0, 0.3] # unwind limit - - # Long control limits - MAX_ACCEL = 2.0 - MIN_ACCEL = -3.48 - INACTIVE_ACCEL = 0.0 - - packer: CANPackerPanda - - @classmethod - def setUpClass(cls): - if cls.__name__ == "TestTeslaSafetyBase": - raise unittest.SkipTest - - def setUp(self): - self.packer = CANPackerPanda("tesla_model3_party") - self.define = CANDefine("tesla_model3_party") - self.acc_states = {d: v for v, d in self.define.dv["DAS_control"]["DAS_accState"].items()} - - def _angle_cmd_msg(self, angle: float, enabled: bool): - values = {"DAS_steeringAngleRequest": angle, "DAS_steeringControlType": 1 if enabled else 0} - return self.packer.make_can_msg_panda("DAS_steeringControl", 0, values) - - def _angle_meas_msg(self, angle: float): - values = {"EPAS3S_internalSAS": angle} - return self.packer.make_can_msg_panda("EPAS3S_sysStatus", 0, values) - - def _user_brake_msg(self, brake): - values = {"IBST_driverBrakeApply": 2 if brake else 1} - return self.packer.make_can_msg_panda("IBST_status", 0, values) - - def _speed_msg(self, speed): - values = {"DI_vehicleSpeed": speed * 3.6} - return self.packer.make_can_msg_panda("DI_speed", 0, values) - - def _vehicle_moving_msg(self, speed: float): - values = {"DI_cruiseState": 3 if speed <= self.STANDSTILL_THRESHOLD else 2} - return self.packer.make_can_msg_panda("DI_state", 0, values) - - def _user_gas_msg(self, gas): - values = {"DI_accelPedalPos": gas} - return self.packer.make_can_msg_panda("DI_systemStatus", 0, values) - - def _pcm_status_msg(self, enable): - values = {"DI_cruiseState": 2 if enable else 0} - return self.packer.make_can_msg_panda("DI_state", 0, values) - - def _long_control_msg(self, set_speed, acc_state=0, jerk_limits=(0, 0), accel_limits=(0, 0), aeb_event=0, bus=0): - values = { - "DAS_setSpeed": set_speed, - "DAS_accState": acc_state, - "DAS_aebEvent": aeb_event, - "DAS_jerkMin": jerk_limits[0], - "DAS_jerkMax": jerk_limits[1], - "DAS_accelMin": accel_limits[0], - "DAS_accelMax": accel_limits[1], - } - return self.packer.make_can_msg_panda("DAS_control", bus, values) - - def _accel_msg(self, accel: float): - # For common.LongitudinalAccelSafetyTest - return self._long_control_msg(10, accel_limits=(accel, max(accel, 0))) - - def test_vehicle_speed_measurements(self): - # OVERRIDDEN: 79.1667 is the max speed in m/s - self._common_measurement_test(self._speed_msg, 0, 285 / 3.6, 1, - self.safety.get_vehicle_speed_min, self.safety.get_vehicle_speed_max) - - -class TestTeslaStockSafety(TestTeslaSafetyBase): - - LONGITUDINAL = False - - def setUp(self): - super().setUp() - self.safety = libsafety_py.libsafety - self.safety.set_safety_hooks(CarParams.SafetyModel.tesla, 0) - self.safety.init_tests() - - def test_cancel(self): - for acc_state in range(16): - self.safety.set_controls_allowed(True) - should_tx = acc_state == self.acc_states["ACC_CANCEL_GENERIC_SILENT"] - self.assertFalse(self._tx(self._long_control_msg(0, acc_state=acc_state, accel_limits=(self.MIN_ACCEL, self.MAX_ACCEL)))) - self.assertEqual(should_tx, self._tx(self._long_control_msg(0, acc_state=acc_state))) - - def test_no_aeb(self): - for aeb_event in range(4): - self.assertEqual(self._tx(self._long_control_msg(10, acc_state=self.acc_states["ACC_CANCEL_GENERIC_SILENT"], aeb_event=aeb_event)), aeb_event == 0) - - -class TestTeslaLongitudinalSafety(TestTeslaSafetyBase): - RELAY_MALFUNCTION_ADDRS = {0: (MSG_DAS_steeringControl, MSG_APS_eacMonitor, MSG_DAS_Control)} - FWD_BLACKLISTED_ADDRS = {2: [MSG_DAS_steeringControl, MSG_APS_eacMonitor, MSG_DAS_Control]} - - def setUp(self): - super().setUp() - self.safety = libsafety_py.libsafety - self.safety.set_safety_hooks(CarParams.SafetyModel.tesla, TeslaSafetyFlags.LONG_CONTROL) - self.safety.init_tests() - - def test_no_aeb(self): - for aeb_event in range(4): - self.assertEqual(self._tx(self._long_control_msg(10, aeb_event=aeb_event)), aeb_event == 0) - - def test_stock_aeb_passthrough(self): - no_aeb_msg = self._long_control_msg(10, aeb_event=0) - no_aeb_msg_cam = self._long_control_msg(10, aeb_event=0, bus=2) - aeb_msg_cam = self._long_control_msg(10, aeb_event=1, bus=2) - - # stock system sends no AEB -> no forwarding, and OP is allowed to TX - self.assertEqual(1, self._rx(no_aeb_msg_cam)) - self.assertEqual(-1, self.safety.safety_fwd_hook(2, no_aeb_msg_cam.addr)) - self.assertTrue(self._tx(no_aeb_msg)) - - # stock system sends AEB -> forwarding, and OP is not allowed to TX - self.assertEqual(1, self._rx(aeb_msg_cam)) - self.assertEqual(0, self.safety.safety_fwd_hook(2, aeb_msg_cam.addr)) - self.assertFalse(self._tx(no_aeb_msg)) - - def test_prevent_reverse(self): - # Note: Tesla can reverse while at a standstill if both accel_min and accel_max are negative. - self.safety.set_controls_allowed(True) - - # accel_min and accel_max are positive - self.assertTrue(self._tx(self._long_control_msg(set_speed=10, accel_limits=(1.1, 0.8)))) - self.assertTrue(self._tx(self._long_control_msg(set_speed=0, accel_limits=(1.1, 0.8)))) - - # accel_min and accel_max are both zero - self.assertTrue(self._tx(self._long_control_msg(set_speed=10, accel_limits=(0, 0)))) - self.assertTrue(self._tx(self._long_control_msg(set_speed=0, accel_limits=(0, 0)))) - - # accel_min and accel_max have opposing signs - self.assertTrue(self._tx(self._long_control_msg(set_speed=10, accel_limits=(-0.8, 1.3)))) - self.assertTrue(self._tx(self._long_control_msg(set_speed=0, accel_limits=(0.8, -1.3)))) - self.assertTrue(self._tx(self._long_control_msg(set_speed=0, accel_limits=(0, -1.3)))) - - # accel_min and accel_max are negative - self.assertFalse(self._tx(self._long_control_msg(set_speed=10, accel_limits=(-1.1, -0.6)))) - self.assertFalse(self._tx(self._long_control_msg(set_speed=0, accel_limits=(-0.6, -1.1)))) - self.assertFalse(self._tx(self._long_control_msg(set_speed=0, accel_limits=(-0.1, -0.1)))) - - -if __name__ == "__main__": - unittest.main() diff --git a/opendbc/safety/tests/test_toyota.py b/opendbc/safety/tests/test_toyota.py deleted file mode 100755 index 035c4dc09a3..00000000000 --- a/opendbc/safety/tests/test_toyota.py +++ /dev/null @@ -1,356 +0,0 @@ -#!/usr/bin/env python3 -import numpy as np -import random -import unittest -import itertools - -from opendbc.car.toyota.values import ToyotaSafetyFlags -from opendbc.car.structs import CarParams -from opendbc.safety.tests.libsafety import libsafety_py -import opendbc.safety.tests.common as common -from opendbc.safety.tests.common import CANPackerPanda - -TOYOTA_COMMON_TX_MSGS = [[0x2E4, 0], [0x191, 0], [0x412, 0], [0x343, 0], [0x1D2, 0]] # LKAS + LTA + ACC & PCM cancel cmds -TOYOTA_SECOC_TX_MSGS = [[0x131, 0]] + TOYOTA_COMMON_TX_MSGS -TOYOTA_COMMON_LONG_TX_MSGS = [[0x283, 0], [0x2E6, 0], [0x2E7, 0], [0x33E, 0], [0x344, 0], [0x365, 0], [0x366, 0], [0x4CB, 0], # DSU bus 0 - [0x128, 1], [0x141, 1], [0x160, 1], [0x161, 1], [0x470, 1], # DSU bus 1 - [0x411, 0], # PCS_HUD - [0x750, 0]] # radar diagnostic address - - -class TestToyotaSafetyBase(common.PandaCarSafetyTest, common.LongitudinalAccelSafetyTest): - - TX_MSGS = TOYOTA_COMMON_TX_MSGS + TOYOTA_COMMON_LONG_TX_MSGS - RELAY_MALFUNCTION_ADDRS = {0: (0x2E4, 0x343)} - FWD_BLACKLISTED_ADDRS = {2: [0x2E4, 0x412, 0x191, 0x343]} - EPS_SCALE = 73 - - packer: CANPackerPanda - safety: libsafety_py.Panda - - @classmethod - def setUpClass(cls): - if cls.__name__.endswith("Base"): - cls.packer = None - cls.safety = None - raise unittest.SkipTest - - def _torque_meas_msg(self, torque: int, driver_torque: int | None = None): - values = {"STEER_TORQUE_EPS": (torque / self.EPS_SCALE) * 100.} - if driver_torque is not None: - values["STEER_TORQUE_DRIVER"] = driver_torque - return self.packer.make_can_msg_panda("STEER_TORQUE_SENSOR", 0, values) - - # Both torque and angle safety modes test with each other's steering commands - def _torque_cmd_msg(self, torque, steer_req=1): - values = {"STEER_TORQUE_CMD": torque, "STEER_REQUEST": steer_req} - return self.packer.make_can_msg_panda("STEERING_LKA", 0, values) - - def _angle_meas_msg(self, angle: float, steer_angle_initializing: bool = False): - # This creates a steering torque angle message. Not set on all platforms, - # relative to init angle on some older TSS2 platforms. Only to be used with LTA - values = {"STEER_ANGLE": angle, "STEER_ANGLE_INITIALIZING": int(steer_angle_initializing)} - return self.packer.make_can_msg_panda("STEER_TORQUE_SENSOR", 0, values) - - def _angle_cmd_msg(self, angle: float, enabled: bool): - return self._lta_msg(int(enabled), int(enabled), angle, torque_wind_down=100 if enabled else 0) - - def _lta_msg(self, req, req2, angle_cmd, torque_wind_down=100): - values = {"STEER_REQUEST": req, "STEER_REQUEST_2": req2, "STEER_ANGLE_CMD": angle_cmd, "TORQUE_WIND_DOWN": torque_wind_down} - return self.packer.make_can_msg_panda("STEERING_LTA", 0, values) - - def _accel_msg(self, accel, cancel_req=0): - values = {"ACCEL_CMD": accel, "CANCEL_REQ": cancel_req} - return self.packer.make_can_msg_panda("ACC_CONTROL", 0, values) - - def _speed_msg(self, speed): - values = {("WHEEL_SPEED_%s" % n): speed * 3.6 for n in ["FR", "FL", "RR", "RL"]} - return self.packer.make_can_msg_panda("WHEEL_SPEEDS", 0, values) - - def _user_brake_msg(self, brake): - values = {"BRAKE_PRESSED": brake} - return self.packer.make_can_msg_panda("BRAKE_MODULE", 0, values) - - def _user_gas_msg(self, gas): - cruise_active = self.safety.get_controls_allowed() - values = {"GAS_RELEASED": not gas, "CRUISE_ACTIVE": cruise_active} - return self.packer.make_can_msg_panda("PCM_CRUISE", 0, values) - - def _pcm_status_msg(self, enable): - values = {"CRUISE_ACTIVE": enable} - return self.packer.make_can_msg_panda("PCM_CRUISE", 0, values) - - def test_diagnostics(self, stock_longitudinal: bool = False): - for should_tx, msg in ((False, b"\x6D\x02\x3E\x00\x00\x00\x00\x00"), # fwdCamera tester present - (False, b"\x0F\x03\xAA\xAA\x00\x00\x00\x00"), # non-tester present - (True, b"\x0F\x02\x3E\x00\x00\x00\x00\x00")): - tester_present = libsafety_py.make_CANPacket(0x750, 0, msg) - self.assertEqual(should_tx and not stock_longitudinal, self._tx(tester_present)) - - def test_block_aeb(self, stock_longitudinal: bool = False): - for controls_allowed in (True, False): - for bad in (True, False): - for _ in range(10): - self.safety.set_controls_allowed(controls_allowed) - dat = [random.randint(1, 255) for _ in range(7)] - if not bad: - dat = [0]*6 + dat[-1:] - msg = libsafety_py.make_CANPacket(0x283, 0, bytes(dat)) - self.assertEqual(not bad and not stock_longitudinal, self._tx(msg)) - - # Only allow LTA msgs with no actuation - def test_lta_steer_cmd(self): - for engaged, req, req2, torque_wind_down, angle in itertools.product([True, False], - [0, 1], [0, 1], - [0, 50, 100], - np.linspace(-20, 20, 5)): - self.safety.set_controls_allowed(engaged) - - should_tx = not req and not req2 and angle == 0 and torque_wind_down == 0 - self.assertEqual(should_tx, self._tx(self._lta_msg(req, req2, angle, torque_wind_down)), - f"{req=} {req2=} {angle=} {torque_wind_down=}") - - def test_rx_hook(self): - # checksum checks - for msg in ["trq", "pcm"]: - self.safety.set_controls_allowed(1) - if msg == "trq": - to_push = self._torque_meas_msg(0) - if msg == "pcm": - to_push = self._pcm_status_msg(True) - self.assertTrue(self._rx(to_push)) - to_push[0].data[4] = 0 - to_push[0].data[5] = 0 - to_push[0].data[6] = 0 - to_push[0].data[7] = 0 - self.assertFalse(self._rx(to_push)) - self.assertFalse(self.safety.get_controls_allowed()) - - -class TestToyotaSafetyTorque(TestToyotaSafetyBase, common.MotorTorqueSteeringSafetyTest, common.SteerRequestCutSafetyTest): - - MAX_RATE_UP = 15 - MAX_RATE_DOWN = 25 - MAX_TORQUE = 1500 - MAX_RT_DELTA = 450 - RT_INTERVAL = 250000 - MAX_TORQUE_ERROR = 350 - TORQUE_MEAS_TOLERANCE = 1 # toyota safety adds one to be conservative for rounding - - # Safety around steering req bit - MIN_VALID_STEERING_FRAMES = 18 - MAX_INVALID_STEERING_FRAMES = 1 - MIN_VALID_STEERING_RT_INTERVAL = 170000 # a ~10% buffer, can send steer up to 110Hz - - def setUp(self): - self.packer = CANPackerPanda("toyota_nodsu_pt_generated") - self.safety = libsafety_py.libsafety - self.safety.set_safety_hooks(CarParams.SafetyModel.toyota, self.EPS_SCALE) - self.safety.init_tests() - - -class TestToyotaSafetyAngle(TestToyotaSafetyBase, common.AngleSteeringSafetyTest): - - # Angle control limits - STEER_ANGLE_MAX = 94.9461 # deg - DEG_TO_CAN = 17.452007 # 1 / 0.0573 deg to can - - ANGLE_RATE_BP = [5., 25., 25.] - ANGLE_RATE_UP = [0.3, 0.15, 0.15] # windup limit - ANGLE_RATE_DOWN = [0.36, 0.26, 0.26] # unwind limit - - MAX_LTA_ANGLE = 94.9461 # PCS faults if commanding above this, deg - MAX_MEAS_TORQUE = 1500 # max allowed measured EPS torque before wind down - MAX_LTA_DRIVER_TORQUE = 150 # max allowed driver torque before wind down - - def setUp(self): - self.packer = CANPackerPanda("toyota_nodsu_pt_generated") - self.safety = libsafety_py.libsafety - self.safety.set_safety_hooks(CarParams.SafetyModel.toyota, self.EPS_SCALE | ToyotaSafetyFlags.LTA) - self.safety.init_tests() - - # Only allow LKA msgs with no actuation - def test_lka_steer_cmd(self): - for engaged, steer_req, torque in itertools.product([True, False], - [0, 1], - np.linspace(-1500, 1500, 7)): - self.safety.set_controls_allowed(engaged) - torque = int(torque) - self.safety.set_rt_torque_last(torque) - self.safety.set_torque_meas(torque, torque) - self.safety.set_desired_torque_last(torque) - - should_tx = not steer_req and torque == 0 - self.assertEqual(should_tx, self._tx(self._torque_cmd_msg(torque, steer_req))) - - def test_lta_steer_cmd(self): - """ - Tests the LTA steering command message - controls_allowed: - * STEER_REQUEST and STEER_REQUEST_2 do not mismatch - * TORQUE_WIND_DOWN is only set to 0 or 100 when STEER_REQUEST and STEER_REQUEST_2 are both 1 - * Full torque messages are blocked if either EPS torque or driver torque is above the threshold - - not controls_allowed: - * STEER_REQUEST, STEER_REQUEST_2, and TORQUE_WIND_DOWN are all 0 - """ - for controls_allowed in (True, False): - for angle in np.arange(-90, 90, 1): - self.safety.set_controls_allowed(controls_allowed) - self._reset_angle_measurement(angle) - self._set_prev_desired_angle(angle) - - self.assertTrue(self._tx(self._lta_msg(0, 0, angle, 0))) - if controls_allowed: - # Test the two steer request bits and TORQUE_WIND_DOWN torque wind down signal - for req, req2, torque_wind_down in itertools.product([0, 1], [0, 1], [0, 50, 100]): - mismatch = not (req or req2) and torque_wind_down != 0 - should_tx = req == req2 and (torque_wind_down in (0, 100)) and not mismatch - self.assertEqual(should_tx, self._tx(self._lta_msg(req, req2, angle, torque_wind_down))) - - # Test max EPS torque and driver override thresholds - cases = itertools.product( - (0, self.MAX_MEAS_TORQUE - 1, self.MAX_MEAS_TORQUE, self.MAX_MEAS_TORQUE + 1, self.MAX_MEAS_TORQUE * 2), - (0, self.MAX_LTA_DRIVER_TORQUE - 1, self.MAX_LTA_DRIVER_TORQUE, self.MAX_LTA_DRIVER_TORQUE + 1, self.MAX_LTA_DRIVER_TORQUE * 2) - ) - - for eps_torque, driver_torque in cases: - for sign in (-1, 1): - for _ in range(6): - self._rx(self._torque_meas_msg(sign * eps_torque, sign * driver_torque)) - - # Toyota adds 1 to EPS torque since it is rounded after EPS factor - should_tx = (eps_torque - 1) <= self.MAX_MEAS_TORQUE and driver_torque <= self.MAX_LTA_DRIVER_TORQUE - self.assertEqual(should_tx, self._tx(self._lta_msg(1, 1, angle, 100))) - self.assertTrue(self._tx(self._lta_msg(1, 1, angle, 0))) # should tx if we wind down torque - - else: - # Controls not allowed - for req, req2, torque_wind_down in itertools.product([0, 1], [0, 1], [0, 50, 100]): - should_tx = not (req or req2) and torque_wind_down == 0 - self.assertEqual(should_tx, self._tx(self._lta_msg(req, req2, angle, torque_wind_down))) - - def test_angle_measurements(self): - """ - * Tests angle meas quality flag dictates whether angle measurement is parsed, and if rx is valid - * Tests rx hook correctly clips the angle measurement, since it is to be compared to LTA cmd when inactive - """ - for steer_angle_initializing in (True, False): - for angle in np.arange(0, self.STEER_ANGLE_MAX * 2, 1): - # If init flag is set, do not rx or parse any angle measurements - for a in (angle, -angle, 0, 0, 0, 0): - self.assertEqual(not steer_angle_initializing, - self._rx(self._angle_meas_msg(a, steer_angle_initializing))) - - final_angle = 0 if steer_angle_initializing else round(angle * self.DEG_TO_CAN) - self.assertEqual(self.safety.get_angle_meas_min(), -final_angle) - self.assertEqual(self.safety.get_angle_meas_max(), final_angle) - - self._rx(self._angle_meas_msg(0)) - self.assertEqual(self.safety.get_angle_meas_min(), -final_angle) - self.assertEqual(self.safety.get_angle_meas_max(), 0) - - self._rx(self._angle_meas_msg(0)) - self.assertEqual(self.safety.get_angle_meas_min(), 0) - self.assertEqual(self.safety.get_angle_meas_max(), 0) - - -class TestToyotaAltBrakeSafety(TestToyotaSafetyTorque): - - def setUp(self): - self.packer = CANPackerPanda("toyota_new_mc_pt_generated") - self.safety = libsafety_py.libsafety - self.safety.set_safety_hooks(CarParams.SafetyModel.toyota, self.EPS_SCALE | ToyotaSafetyFlags.ALT_BRAKE) - self.safety.init_tests() - - def _user_brake_msg(self, brake): - values = {"BRAKE_PRESSED": brake} - return self.packer.make_can_msg_panda("BRAKE_MODULE", 0, values) - - # No LTA message in the DBC - def test_lta_steer_cmd(self): - pass - - -class TestToyotaStockLongitudinalBase(TestToyotaSafetyBase): - - TX_MSGS = TOYOTA_COMMON_TX_MSGS - # Base addresses minus ACC_CONTROL (0x343) - RELAY_MALFUNCTION_ADDRS = {0: (0x2E4,)} - FWD_BLACKLISTED_ADDRS = {2: [0x2E4, 0x412, 0x191]} - - LONGITUDINAL = False - - def test_diagnostics(self, stock_longitudinal: bool = True): - super().test_diagnostics(stock_longitudinal=stock_longitudinal) - - def test_block_aeb(self, stock_longitudinal: bool = True): - super().test_block_aeb(stock_longitudinal=stock_longitudinal) - - def test_acc_cancel(self): - """ - Regardless of controls allowed, never allow ACC_CONTROL if cancel bit isn't set - """ - for controls_allowed in [True, False]: - self.safety.set_controls_allowed(controls_allowed) - for accel in np.arange(self.MIN_ACCEL - 1, self.MAX_ACCEL + 1, 0.1): - self.assertFalse(self._tx(self._accel_msg(accel))) - should_tx = np.isclose(accel, 0, atol=0.0001) - self.assertEqual(should_tx, self._tx(self._accel_msg(accel, cancel_req=1))) - - -class TestToyotaStockLongitudinalTorque(TestToyotaStockLongitudinalBase, TestToyotaSafetyTorque): - - def setUp(self): - self.packer = CANPackerPanda("toyota_nodsu_pt_generated") - self.safety = libsafety_py.libsafety - self.safety.set_safety_hooks(CarParams.SafetyModel.toyota, self.EPS_SCALE | ToyotaSafetyFlags.STOCK_LONGITUDINAL) - self.safety.init_tests() - - -class TestToyotaStockLongitudinalAngle(TestToyotaStockLongitudinalBase, TestToyotaSafetyAngle): - - def setUp(self): - self.packer = CANPackerPanda("toyota_nodsu_pt_generated") - self.safety = libsafety_py.libsafety - self.safety.set_safety_hooks(CarParams.SafetyModel.toyota, - self.EPS_SCALE | ToyotaSafetyFlags.STOCK_LONGITUDINAL | ToyotaSafetyFlags.LTA) - self.safety.init_tests() - - -class TestToyotaSecOcSafety(TestToyotaStockLongitudinalBase): - - TX_MSGS = TOYOTA_SECOC_TX_MSGS - RELAY_MALFUNCTION_ADDRS = {0: (0x2E4,)} - FWD_BLACKLISTED_ADDRS = {2: [0x2E4, 0x412, 0x191, 0x131]} - - def setUp(self): - self.packer = CANPackerPanda("toyota_secoc_pt_generated") - self.safety = libsafety_py.libsafety - self.safety.set_safety_hooks(CarParams.SafetyModel.toyota, - self.EPS_SCALE | ToyotaSafetyFlags.STOCK_LONGITUDINAL | ToyotaSafetyFlags.SECOC) - self.safety.init_tests() - - # This platform also has alternate brake and PCM messages, but same naming in the DBC, so same packers work - - def _user_gas_msg(self, gas): - values = {"GAS_PEDAL_USER": gas} - return self.packer.make_can_msg_panda("GAS_PEDAL", 0, values) - - # This platform sends both STEERING_LTA (same as other Toyota) and STEERING_LTA_2 (SecOC signed) - # STEERING_LTA is checked for no-actuation by the base class, STEERING_LTA_2 is checked for no-actuation below - - def _lta_2_msg(self, req, req2, angle_cmd, torque_wind_down=100): - values = {"STEER_REQUEST": req, "STEER_REQUEST_2": req2, "STEER_ANGLE_CMD": angle_cmd} - return self.packer.make_can_msg_panda("STEERING_LTA_2", 0, values) - - def test_lta_2_steer_cmd(self): - for engaged, req, req2, angle in itertools.product([True, False], [0, 1], [0, 1], np.linspace(-20, 20, 5)): - self.safety.set_controls_allowed(engaged) - - should_tx = not req and not req2 and angle == 0 - self.assertEqual(should_tx, self._tx(self._lta_2_msg(req, req2, angle)), f"{req=} {req2=} {angle=}") - - -if __name__ == "__main__": - unittest.main() diff --git a/opendbc/safety/tests/test_volkswagen_mqb.py b/opendbc/safety/tests/test_volkswagen_mqb.py deleted file mode 100755 index 1d66fbd7459..00000000000 --- a/opendbc/safety/tests/test_volkswagen_mqb.py +++ /dev/null @@ -1,223 +0,0 @@ -#!/usr/bin/env python3 -import unittest -import numpy as np -from opendbc.car.structs import CarParams -from opendbc.safety.tests.libsafety import libsafety_py -import opendbc.safety.tests.common as common -from opendbc.safety.tests.common import CANPackerPanda -from opendbc.car.volkswagen.values import VolkswagenSafetyFlags - -MAX_ACCEL = 2.0 -MIN_ACCEL = -3.5 - -MSG_ESP_19 = 0xB2 # RX from ABS, for wheel speeds -MSG_LH_EPS_03 = 0x9F # RX from EPS, for driver steering torque -MSG_ESP_05 = 0x106 # RX from ABS, for brake light state -MSG_TSK_06 = 0x120 # RX from ECU, for ACC status from drivetrain coordinator -MSG_MOTOR_20 = 0x121 # RX from ECU, for driver throttle input -MSG_ACC_06 = 0x122 # TX by OP, ACC control instructions to the drivetrain coordinator -MSG_HCA_01 = 0x126 # TX by OP, Heading Control Assist steering torque -MSG_GRA_ACC_01 = 0x12B # TX by OP, ACC control buttons for cancel/resume -MSG_ACC_07 = 0x12E # TX by OP, ACC control instructions to the drivetrain coordinator -MSG_ACC_02 = 0x30C # TX by OP, ACC HUD data to the instrument cluster -MSG_LDW_02 = 0x397 # TX by OP, Lane line recognition and text alerts - - -class TestVolkswagenMqbSafety(common.PandaCarSafetyTest, common.DriverTorqueSteeringSafetyTest): - RELAY_MALFUNCTION_ADDRS = {0: (MSG_HCA_01,)} - - MAX_RATE_UP = 4 - MAX_RATE_DOWN = 10 - MAX_TORQUE = 300 - MAX_RT_DELTA = 75 - RT_INTERVAL = 250000 - - DRIVER_TORQUE_ALLOWANCE = 80 - DRIVER_TORQUE_FACTOR = 3 - - @classmethod - def setUpClass(cls): - if cls.__name__ == "TestVolkswagenMqbSafety": - cls.packer = None - cls.safety = None - raise unittest.SkipTest - - # Wheel speeds _esp_19_msg - def _speed_msg(self, speed): - values = {"ESP_%s_Radgeschw_02" % s: speed for s in ["HL", "HR", "VL", "VR"]} - return self.packer.make_can_msg_panda("ESP_19", 0, values) - - # Driver brake pressure over threshold - def _esp_05_msg(self, brake): - values = {"ESP_Fahrer_bremst": brake} - return self.packer.make_can_msg_panda("ESP_05", 0, values) - - # Brake pedal switch - def _motor_14_msg(self, brake): - values = {"MO_Fahrer_bremst": brake} - return self.packer.make_can_msg_panda("Motor_14", 0, values) - - def _user_brake_msg(self, brake): - return self._motor_14_msg(brake) - - # Driver throttle input - def _user_gas_msg(self, gas): - values = {"MO_Fahrpedalrohwert_01": gas} - return self.packer.make_can_msg_panda("Motor_20", 0, values) - - # ACC engagement status - def _tsk_status_msg(self, enable, main_switch=True): - if main_switch: - tsk_status = 3 if enable else 2 - else: - tsk_status = 0 - values = {"TSK_Status": tsk_status} - return self.packer.make_can_msg_panda("TSK_06", 0, values) - - def _pcm_status_msg(self, enable): - return self._tsk_status_msg(enable) - - # Driver steering input torque - def _torque_driver_msg(self, torque): - values = {"EPS_Lenkmoment": abs(torque), "EPS_VZ_Lenkmoment": torque < 0} - return self.packer.make_can_msg_panda("LH_EPS_03", 0, values) - - # openpilot steering output torque - def _torque_cmd_msg(self, torque, steer_req=1): - values = {"HCA_01_LM_Offset": abs(torque), "HCA_01_LM_OffSign": torque < 0, "HCA_01_Sendestatus": steer_req} - return self.packer.make_can_msg_panda("HCA_01", 0, values) - - # Cruise control buttons - def _gra_acc_01_msg(self, cancel=0, resume=0, _set=0, bus=2): - values = {"GRA_Abbrechen": cancel, "GRA_Tip_Setzen": _set, "GRA_Tip_Wiederaufnahme": resume} - return self.packer.make_can_msg_panda("GRA_ACC_01", bus, values) - - # Acceleration request to drivetrain coordinator - def _acc_06_msg(self, accel): - values = {"ACC_Sollbeschleunigung_02": accel} - return self.packer.make_can_msg_panda("ACC_06", 0, values) - - # Acceleration request to drivetrain coordinator - def _acc_07_msg(self, accel, secondary_accel=3.02): - values = {"ACC_Sollbeschleunigung_02": accel, "ACC_Folgebeschl": secondary_accel} - return self.packer.make_can_msg_panda("ACC_07", 0, values) - - # Verify brake_pressed is true if either the switch or pressure threshold signals are true - def test_redundant_brake_signals(self): - test_combinations = [(True, True, True), (True, True, False), (True, False, True), (False, False, False)] - for brake_pressed, motor_14_signal, esp_05_signal in test_combinations: - self._rx(self._motor_14_msg(False)) - self._rx(self._esp_05_msg(False)) - self.assertFalse(self.safety.get_brake_pressed_prev()) - self._rx(self._motor_14_msg(motor_14_signal)) - self._rx(self._esp_05_msg(esp_05_signal)) - self.assertEqual(brake_pressed, self.safety.get_brake_pressed_prev(), - f"expected {brake_pressed=} with {motor_14_signal=} and {esp_05_signal=}") - - def test_torque_measurements(self): - # TODO: make this test work with all cars - self._rx(self._torque_driver_msg(50)) - self._rx(self._torque_driver_msg(-50)) - self._rx(self._torque_driver_msg(0)) - self._rx(self._torque_driver_msg(0)) - self._rx(self._torque_driver_msg(0)) - self._rx(self._torque_driver_msg(0)) - - self.assertEqual(-50, self.safety.get_torque_driver_min()) - self.assertEqual(50, self.safety.get_torque_driver_max()) - - self._rx(self._torque_driver_msg(0)) - self.assertEqual(0, self.safety.get_torque_driver_max()) - self.assertEqual(-50, self.safety.get_torque_driver_min()) - - self._rx(self._torque_driver_msg(0)) - self.assertEqual(0, self.safety.get_torque_driver_max()) - self.assertEqual(0, self.safety.get_torque_driver_min()) - - -class TestVolkswagenMqbStockSafety(TestVolkswagenMqbSafety): - TX_MSGS = [[MSG_HCA_01, 0], [MSG_LDW_02, 0], [MSG_LH_EPS_03, 2], [MSG_GRA_ACC_01, 0], [MSG_GRA_ACC_01, 2]] - FWD_BLACKLISTED_ADDRS = {0: [MSG_LH_EPS_03], 2: [MSG_HCA_01, MSG_LDW_02]} - - def setUp(self): - self.packer = CANPackerPanda("vw_mqb_2010") - self.safety = libsafety_py.libsafety - self.safety.set_safety_hooks(CarParams.SafetyModel.volkswagen, 0) - self.safety.init_tests() - - def test_spam_cancel_safety_check(self): - self.safety.set_controls_allowed(0) - self.assertTrue(self._tx(self._gra_acc_01_msg(cancel=1))) - self.assertFalse(self._tx(self._gra_acc_01_msg(resume=1))) - self.assertFalse(self._tx(self._gra_acc_01_msg(_set=1))) - # do not block resume if we are engaged already - self.safety.set_controls_allowed(1) - self.assertTrue(self._tx(self._gra_acc_01_msg(resume=1))) - - -class TestVolkswagenMqbLongSafety(TestVolkswagenMqbSafety): - TX_MSGS = [[MSG_HCA_01, 0], [MSG_LDW_02, 0], [MSG_LH_EPS_03, 2], [MSG_ACC_02, 0], [MSG_ACC_06, 0], [MSG_ACC_07, 0]] - FWD_BLACKLISTED_ADDRS = {0: [MSG_LH_EPS_03], 2: [MSG_HCA_01, MSG_LDW_02, MSG_ACC_02, MSG_ACC_06, MSG_ACC_07]} - INACTIVE_ACCEL = 3.01 - - def setUp(self): - self.packer = CANPackerPanda("vw_mqb_2010") - self.safety = libsafety_py.libsafety - self.safety.set_safety_hooks(CarParams.SafetyModel.volkswagen, VolkswagenSafetyFlags.LONG_CONTROL) - self.safety.init_tests() - - # stock cruise controls are entirely bypassed under openpilot longitudinal control - def test_disable_control_allowed_from_cruise(self): - pass - - def test_enable_control_allowed_from_cruise(self): - pass - - def test_cruise_engaged_prev(self): - pass - - def test_set_and_resume_buttons(self): - for button in ["set", "resume"]: - # ACC main switch must be on, engage on falling edge - self.safety.set_controls_allowed(0) - self._rx(self._tsk_status_msg(False, main_switch=False)) - self._rx(self._gra_acc_01_msg(_set=(button == "set"), resume=(button == "resume"), bus=0)) - self.assertFalse(self.safety.get_controls_allowed(), f"controls allowed on {button} with main switch off") - self._rx(self._tsk_status_msg(False, main_switch=True)) - self._rx(self._gra_acc_01_msg(_set=(button == "set"), resume=(button == "resume"), bus=0)) - self.assertFalse(self.safety.get_controls_allowed(), f"controls allowed on {button} rising edge") - self._rx(self._gra_acc_01_msg(bus=0)) - self.assertTrue(self.safety.get_controls_allowed(), f"controls not allowed on {button} falling edge") - - def test_cancel_button(self): - # Disable on rising edge of cancel button - self._rx(self._tsk_status_msg(False, main_switch=True)) - self.safety.set_controls_allowed(1) - self._rx(self._gra_acc_01_msg(cancel=True, bus=0)) - self.assertFalse(self.safety.get_controls_allowed(), "controls allowed after cancel") - - def test_main_switch(self): - # Disable as soon as main switch turns off - self._rx(self._tsk_status_msg(False, main_switch=True)) - self.safety.set_controls_allowed(1) - self._rx(self._tsk_status_msg(False, main_switch=False)) - self.assertFalse(self.safety.get_controls_allowed(), "controls allowed after ACC main switch off") - - def test_accel_safety_check(self): - for controls_allowed in [True, False]: - # enforce we don't skip over 0 or inactive accel - for accel in np.concatenate((np.arange(MIN_ACCEL - 2, MAX_ACCEL + 2, 0.03), [0, self.INACTIVE_ACCEL])): - accel = round(accel, 2) # floats might not hit exact boundary conditions without rounding - is_inactive_accel = accel == self.INACTIVE_ACCEL - send = (controls_allowed and MIN_ACCEL <= accel <= MAX_ACCEL) or is_inactive_accel - self.safety.set_controls_allowed(controls_allowed) - # primary accel request used by ECU - self.assertEqual(send, self._tx(self._acc_06_msg(accel)), (controls_allowed, accel)) - # additional accel request used by ABS/ESP - self.assertEqual(send, self._tx(self._acc_07_msg(accel)), (controls_allowed, accel)) - # ensure the optional secondary accel field remains inactive for now - self.assertEqual(is_inactive_accel, self._tx(self._acc_07_msg(accel, secondary_accel=accel)), (controls_allowed, accel)) - - -if __name__ == "__main__": - unittest.main() diff --git a/opendbc/safety/tests/test_volkswagen_pq.py b/opendbc/safety/tests/test_volkswagen_pq.py deleted file mode 100755 index 72d08764260..00000000000 --- a/opendbc/safety/tests/test_volkswagen_pq.py +++ /dev/null @@ -1,198 +0,0 @@ -#!/usr/bin/env python3 -import unittest - -from opendbc.car.volkswagen.values import VolkswagenSafetyFlags -from opendbc.car.structs import CarParams -from opendbc.safety.tests.libsafety import libsafety_py -import opendbc.safety.tests.common as common -from opendbc.safety.tests.common import CANPackerPanda - -MSG_LENKHILFE_3 = 0x0D0 # RX from EPS, for steering angle and driver steering torque -MSG_HCA_1 = 0x0D2 # TX by OP, Heading Control Assist steering torque -MSG_BREMSE_1 = 0x1A0 # RX from ABS, for ego speed -MSG_MOTOR_2 = 0x288 # RX from ECU, for CC state and brake switch state -MSG_ACC_SYSTEM = 0x368 # TX by OP, longitudinal acceleration controls -MSG_MOTOR_3 = 0x380 # RX from ECU, for driver throttle input -MSG_GRA_NEU = 0x38A # TX by OP, ACC control buttons for cancel/resume -MSG_MOTOR_5 = 0x480 # RX from ECU, for ACC main switch state -MSG_ACC_GRA_ANZEIGE = 0x56A # TX by OP, ACC HUD -MSG_LDW_1 = 0x5BE # TX by OP, Lane line recognition and text alerts - - -class TestVolkswagenPqSafety(common.PandaCarSafetyTest, common.DriverTorqueSteeringSafetyTest): - cruise_engaged = False - - RELAY_MALFUNCTION_ADDRS = {0: (MSG_HCA_1,)} - - MAX_RATE_UP = 6 - MAX_RATE_DOWN = 10 - MAX_TORQUE = 300 - MAX_RT_DELTA = 113 - RT_INTERVAL = 250000 - - DRIVER_TORQUE_ALLOWANCE = 80 - DRIVER_TORQUE_FACTOR = 3 - - @classmethod - def setUpClass(cls): - if cls.__name__ == "TestVolkswagenPqSafety": - cls.packer = None - cls.safety = None - raise unittest.SkipTest - - def _set_prev_torque(self, t): - self.safety.set_desired_torque_last(t) - self.safety.set_rt_torque_last(t) - - # Ego speed (Bremse_1) - def _speed_msg(self, speed): - values = {"Geschwindigkeit_neu__Bremse_1_": speed} - return self.packer.make_can_msg_panda("Bremse_1", 0, values) - - # Brake light switch (shared message Motor_2) - def _user_brake_msg(self, brake): - # since this signal is used for engagement status, preserve current state - return self._motor_2_msg(brake_pressed=brake, cruise_engaged=self.safety.get_controls_allowed()) - - # ACC engaged status (shared message Motor_2) - def _pcm_status_msg(self, enable): - self.__class__.cruise_engaged = enable - return self._motor_2_msg(cruise_engaged=enable) - - # Acceleration request to drivetrain coordinator - def _accel_msg(self, accel): - values = {"ACS_Sollbeschl": accel} - return self.packer.make_can_msg_panda("ACC_System", 0, values) - - # Driver steering input torque - def _torque_driver_msg(self, torque): - values = {"LH3_LM": abs(torque), "LH3_LMSign": torque < 0} - return self.packer.make_can_msg_panda("Lenkhilfe_3", 0, values) - - # openpilot steering output torque - def _torque_cmd_msg(self, torque, steer_req=1, hca_status=5): - values = {"LM_Offset": abs(torque), "LM_OffSign": torque < 0, "HCA_Status": hca_status if steer_req else 3} - return self.packer.make_can_msg_panda("HCA_1", 0, values) - - # ACC engagement and brake light switch status - # Called indirectly for compatibility with common.py tests - def _motor_2_msg(self, brake_pressed=False, cruise_engaged=False): - values = {"Bremslichtschalter": brake_pressed, - "GRA_Status": cruise_engaged} - return self.packer.make_can_msg_panda("Motor_2", 0, values) - - # ACC main switch status - def _motor_5_msg(self, main_switch=False): - values = {"GRA_Hauptschalter": main_switch} - return self.packer.make_can_msg_panda("Motor_5", 0, values) - - # Driver throttle input (Motor_3) - def _user_gas_msg(self, gas): - values = {"Fahrpedal_Rohsignal": gas} - return self.packer.make_can_msg_panda("Motor_3", 0, values) - - # Cruise control buttons (GRA_Neu) - def _button_msg(self, _set=False, resume=False, cancel=False, bus=2): - values = {"GRA_Neu_Setzen": _set, "GRA_Recall": resume, "GRA_Abbrechen": cancel} - return self.packer.make_can_msg_panda("GRA_Neu", bus, values) - - def test_torque_measurements(self): - # TODO: make this test work with all cars - self._rx(self._torque_driver_msg(50)) - self._rx(self._torque_driver_msg(-50)) - self._rx(self._torque_driver_msg(0)) - self._rx(self._torque_driver_msg(0)) - self._rx(self._torque_driver_msg(0)) - self._rx(self._torque_driver_msg(0)) - - self.assertEqual(-50, self.safety.get_torque_driver_min()) - self.assertEqual(50, self.safety.get_torque_driver_max()) - - self._rx(self._torque_driver_msg(0)) - self.assertEqual(0, self.safety.get_torque_driver_max()) - self.assertEqual(-50, self.safety.get_torque_driver_min()) - - self._rx(self._torque_driver_msg(0)) - self.assertEqual(0, self.safety.get_torque_driver_max()) - self.assertEqual(0, self.safety.get_torque_driver_min()) - - -class TestVolkswagenPqStockSafety(TestVolkswagenPqSafety): - # Transmit of GRA_Neu is allowed on bus 0 and 2 to keep compatibility with gateway and camera integration - TX_MSGS = [[MSG_HCA_1, 0], [MSG_GRA_NEU, 0], [MSG_GRA_NEU, 2], [MSG_LDW_1, 0]] - FWD_BLACKLISTED_ADDRS = {2: [MSG_HCA_1, MSG_LDW_1]} - - def setUp(self): - self.packer = CANPackerPanda("vw_golf_mk4") - self.safety = libsafety_py.libsafety - self.safety.set_safety_hooks(CarParams.SafetyModel.volkswagenPq, 0) - self.safety.init_tests() - - def test_spam_cancel_safety_check(self): - self.safety.set_controls_allowed(0) - self.assertTrue(self._tx(self._button_msg(cancel=True))) - self.assertFalse(self._tx(self._button_msg(resume=True))) - self.assertFalse(self._tx(self._button_msg(_set=True))) - # do not block resume if we are engaged already - self.safety.set_controls_allowed(1) - self.assertTrue(self._tx(self._button_msg(resume=True))) - - -class TestVolkswagenPqLongSafety(TestVolkswagenPqSafety, common.LongitudinalAccelSafetyTest): - TX_MSGS = [[MSG_HCA_1, 0], [MSG_LDW_1, 0], [MSG_ACC_SYSTEM, 0], [MSG_ACC_GRA_ANZEIGE, 0]] - FWD_BLACKLISTED_ADDRS = {2: [MSG_HCA_1, MSG_LDW_1, MSG_ACC_SYSTEM, MSG_ACC_GRA_ANZEIGE]} - INACTIVE_ACCEL = 3.01 - - def setUp(self): - self.packer = CANPackerPanda("vw_golf_mk4") - self.safety = libsafety_py.libsafety - self.safety.set_safety_hooks(CarParams.SafetyModel.volkswagenPq, VolkswagenSafetyFlags.LONG_CONTROL) - self.safety.init_tests() - - # stock cruise controls are entirely bypassed under openpilot longitudinal control - def test_disable_control_allowed_from_cruise(self): - pass - - def test_enable_control_allowed_from_cruise(self): - pass - - def test_cruise_engaged_prev(self): - pass - - def test_set_and_resume_buttons(self): - for button in ["set", "resume"]: - # ACC main switch must be on, engage on falling edge - self.safety.set_controls_allowed(0) - self._rx(self._motor_5_msg(main_switch=False)) - self._rx(self._button_msg(_set=(button == "set"), resume=(button == "resume"), bus=0)) - self._rx(self._button_msg(bus=0)) - self.assertFalse(self.safety.get_controls_allowed(), f"controls allowed on {button} with main switch off") - self._rx(self._motor_5_msg(main_switch=True)) - self._rx(self._button_msg(_set=(button == "set"), resume=(button == "resume"), bus=0)) - self.assertFalse(self.safety.get_controls_allowed(), f"controls allowed on {button} rising edge") - self._rx(self._button_msg(bus=0)) - self.assertTrue(self.safety.get_controls_allowed(), f"controls not allowed on {button} falling edge") - - def test_cancel_button(self): - # Disable on rising edge of cancel button - self._rx(self._motor_5_msg(main_switch=True)) - self.safety.set_controls_allowed(1) - self._rx(self._button_msg(cancel=True, bus=0)) - self.assertFalse(self.safety.get_controls_allowed(), "controls allowed after cancel") - - def test_main_switch(self): - # Disable as soon as main switch turns off - self._rx(self._motor_5_msg(main_switch=True)) - self.safety.set_controls_allowed(1) - self._rx(self._motor_5_msg(main_switch=False)) - self.assertFalse(self.safety.get_controls_allowed(), "controls allowed after ACC main switch off") - - def test_torque_cmd_enable_variants(self): - # The EPS rack accepts either 5 or 7 for an enabled status, with different low speed tuning behavior - self.safety.set_controls_allowed(1) - for enabled_status in (5, 7): - self.assertTrue(self._tx(self._torque_cmd_msg(self.MAX_RATE_UP, steer_req=1, hca_status=enabled_status)), - f"torque cmd rejected with {enabled_status=}") - -if __name__ == "__main__": - unittest.main() diff --git a/pyproject.toml b/pyproject.toml index a67c061a5ca..f656c666770 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -24,13 +24,9 @@ dependencies = [ [project.optional-dependencies] testing = [ - "cffi", "ruff", - "gcovr", "pytest", - "pytest-coverage", "pytest-mock", - "pytest-randomly", "pytest-xdist", "pytest-subtests", "hypothesis==6.47.*", @@ -116,5 +112,4 @@ flake8-implicit-str-concat.allow-multiline=false [tool.ruff.lint.flake8-tidy-imports.banned-api] "pytest.main".msg = "pytest.main requires special handling that is easy to mess up!" -# TODO: re-enable when all tests are converted to pytest -#"unittest".msg = "Use pytest" +"unittest".msg = "Use pytest" diff --git a/setup.sh b/setup.sh deleted file mode 100755 index 732a118183a..00000000000 --- a/setup.sh +++ /dev/null @@ -1,17 +0,0 @@ -#!/bin/bash -set -e - -BASEDIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null && pwd)" - -# TODO: why doesn't uv do this? -export PYTHONPATH=$BASEDIR - -# *** dependencies install *** -if ! command -v uv &>/dev/null; then - echo "'uv' is not installed. Installing 'uv'..." - curl -LsSf https://astral.sh/uv/install.sh | sh -fi - -export UV_PROJECT_ENVIRONMENT="$BASEDIR/.venv" -uv sync --all-extras -source "$PYTHONPATH/.venv/bin/activate" diff --git a/test.sh b/test.sh index da9377134a9..3b2b847e6b2 100755 --- a/test.sh +++ b/test.sh @@ -4,18 +4,28 @@ set -e DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null && pwd)" cd $DIR -source ./setup.sh +# TODO: why doesn't uv do this? +export PYTHONPATH=$DIR + +# *** dependencies install *** +if ! command -v uv &>/dev/null; then + echo "'uv' is not installed. Installing 'uv'..." + curl -LsSf https://astral.sh/uv/install.sh | sh +fi + +uv sync --all-extras +source .venv/bin/activate # *** build *** -scons -j8 +uv run scons -j8 # *** lint *** # TODO: pre-commit is slow; replace it with openpilot's "op lint" -#pre-commit run --all-files -ruff check . +#uv run pre-commit run --all-files +uv run ruff check . # *** test *** -pytest -n8 --ignore opendbc/safety +uv run pytest -n8 # *** all done *** GREEN='\033[0;32m'